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

子类重写方法未生效:国际象棋游戏开发继承故障排查

嘿,我之前做棋类游戏的时候也踩过类似的坑!结合你描述的场景——子类重写父类虚方法后,第二次调用temp2.setgetMoves(generation)没生效,大概率是方法重写的正确性或者对象引用/状态出了问题,咱们一步步拆解排查:

首先排查最容易踩的坑:方法重写的语法正确性

Java里的方法重写有严格的规则,差一点都不算真正的重写,编译器甚至不会报错(除非你加了@Override注解):

  • 必须保证子类方法的签名完全一致:包括方法名、参数类型/数量/顺序,返回值要兼容(比如父类返回List<Move>,子类可以返回ArrayList<Move>,但不能反过来)。举个例子,如果父类是public abstract void setgetMoves(int generation);,子类写成setgetMoves(Integer generation),这不是重写而是重载,第二次调用时可能匹配到了父类的抽象方法(但父类是抽象的,理论上不会实例化,不过如果有其他子类实现了这个重载方法就会出问题)。
  • 一定要给子类的重写方法加上@Override注解!这是最直接的校验方式——如果签名不对,编译器会直接报错,帮你快速定位问题。
然后检查对象引用与状态问题

如果语法没问题,那大概率是调用时的对象或者内部状态出了问题:

  • 确认temp2的实际类型:在调用setgetMoves前加一行打印:System.out.println(temp2.getClass().getName());,看看第二次调用时它是不是你期望的子类实例(比如Pawn/Rook)。会不会在两次调用之间,temp2被重新赋值成了其他子类的对象,甚至是错误的实例?
  • 检查子类setgetMoves依赖的状态:比如棋子的位置(x/y坐标)、是否已经移动过(比如兵的第一步可以走两格)这些变量,在第二次调用前有没有被正确更新?如果状态没同步,就算方法被调用了,生成的走法也会和第一次一样,看起来就像“没生效”。
  • 排查父类/子类的缓存逻辑:有没有在父类或者子类里对setgetMoves的结果做了静态缓存?比如父类里用了static List<Move>来存走法,导致第二次调用直接返回了第一次的缓存值,而没有重新计算。
给你一个正确的父类+子类写法参考
// 父类抽象Piece类
abstract class Piece {
    String pieceType;
    int pieceVal;
    Panel piecePanel;
    // 棋子核心状态:位置
    int posX;
    int posY;

    public Piece(String pieceType, int pieceVal, Panel piecePanel) {
        this.pieceType = pieceType;
        this.pieceVal = pieceVal;
        this.piecePanel = piecePanel;
    }

    // 抽象方法,强制子类实现
    public abstract void setgetMoves(int generation);
}

// 子类:兵(Pawn)
class Pawn extends Piece {
    public Pawn(Panel piecePanel) {
        super("Pawn", 1, piecePanel);
    }

    @Override // 必须加这个注解,确保重写正确
    public void setgetMoves(int generation) {
        // 根据当前位置生成合法走法
        System.out.println("Pawn的setgetMoves被调用,当前位置:" + posX + "," + posY);
        // 这里写具体的走法生成逻辑...
    }
}
最后一步:加日志确认方法调用情况

在父类(如果是抽象方法可以先改成带默认实现的虚方法)和子类的setgetMoves里都加打印语句:

  • 父类(如果有默认实现):System.out.println("父类Piece的setgetMoves被调用");
  • 子类:System.out.println("[子类] " + pieceType + "的setgetMoves被调用");
    第二次调用时看控制台输出,就能明确到底是父类还是子类方法在执行,再针对性解决。

内容的提问来源于stack exchange,提问作者space482

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:32:50