如何在子类中设置父类的final属性?以国际象棋棋子类设计为例
最佳实现方案:通过构造器初始化final属性
针对你的国际象棋棋子类设计需求,让子类固定maxMovementDistance为final属性的最佳方式是在父类Piece中将该属性声明为final,并通过构造器传递值,子类在构造时调用父类构造器传入对应棋子的固定值。这样既保证了属性不可修改,又能让每个子类灵活定义自己的最大移动距离。
具体步骤与代码示例
1. 重构Piece类
首先修改父类,将maxMovementDistance设为private final,并添加带该参数的构造器(确保final属性在实例化时被初始化),同时提供getter方法供外部访问:
public class Piece { private final int maxMovementDistance; // 改为final私有属性 private boolean isWhite = false; private boolean isKilled = false; private boolean canMoveBack = true; private int positionX; private int positionY; // 基础构造器,必须传入最大移动距离 public Piece(int maxMovementDistance) { this.maxMovementDistance = maxMovementDistance; } // 重载构造器,支持初始化更多属性(比如颜色、位置) public Piece(int maxMovementDistance, boolean isWhite, int positionX, int positionY) { this.maxMovementDistance = maxMovementDistance; this.isWhite = isWhite; this.positionX = positionX; this.positionY = positionY; } // Getter方法,因为final属性无法修改,只提供读取权限 public int getMaxMovementDistance() { return maxMovementDistance; } // 其他属性的getter/setter按需实现 public boolean isWhite() { return isWhite; } public void setWhite(boolean white) { isWhite = white; } public boolean isKilled() { return isKilled; } public void setKilled(boolean killed) { isKilled = killed; } // ... 其余属性的getter/setter }
2. 实现子类(以King、Queen、Pawn为例)
每个子类在构造时调用父类构造器,传入该棋子对应的固定最大移动距离:
King类(最大移动距离为1)
public class King extends Piece { public King() { super(1); // 国王每次只能移动1格 } // 带颜色和位置的构造器 public King(boolean isWhite, int positionX, int positionY) { super(1, isWhite, positionX, positionY); } }
Queen类(可移动任意距离,用Integer.MAX_VALUE表示)
public class Queen extends Piece { private static final int QUEEN_MAX_DISTANCE = Integer.MAX_VALUE; public Queen() { super(QUEEN_MAX_DISTANCE); } public Queen(boolean isWhite, int positionX, int positionY) { super(QUEEN_MAX_DISTANCE, isWhite, positionX, positionY); } }
Pawn类(最大移动距离为2,因为第一步可以走2格)
public class Pawn extends Piece { public Pawn() { super(2); // 兵的最大移动距离是2(第一步特殊情况) } public Pawn(boolean isWhite, int positionX, int positionY) { super(2, isWhite, positionX, positionY); } // 注意:兵的移动逻辑需要额外处理(比如后续只能走1格、不能后退等),可以在move方法中实现 }
方案优势
- 不可变性保障:
final属性确保maxMovementDistance一旦初始化就无法被修改,完全符合你的需求。 - 封装性良好:属性设为私有,通过getter访问,避免外部直接操作内部状态,降低耦合。
- 扩展性强:新增棋子子类时,只需在构造器中传入对应的值即可,无需修改父类逻辑,符合开闭原则。
关于特殊棋子的补充说明
对于像Pawn这种移动规则有特殊情况的棋子,maxMovementDistance表示的是最大可能移动距离,具体的移动限制(比如第一步之后只能走1格、不能后退)可以在子类的move方法中单独实现,不会影响final属性的设计逻辑。
内容的提问来源于stack exchange,提问作者unlucky_chap
相关产品推荐
相关产品推荐

