You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子类中设置父类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:59:10