子类重写方法未生效:国际象棋游戏开发继承故障排查
嘿,我之前做棋类游戏的时候也踩过类似的坑!结合你描述的场景——子类重写父类虚方法后,第二次调用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
相关产品推荐
相关产品推荐

