java - 有一个空方法可以吗?

标签 java oop subclass hierarchy chess

有一个空方法并在其子类中覆盖它是否可以? 这就是它在我的代码中的样子。

public class Rook() {

    public void voidCastleRight() { }

}

public class ShortRook() extends Rook {

    @Override
    public void voidCastleRight() {
        getPlayer().setkSC(false); //void King Side Castling (Short Castle)
    }

}

public class LongRook() extends Rook {

    @Override
    public void voidCastleRight() {
        getPlayer().setqSC(false); //void Queen Side Castling (Long Castle)
    }
}

上下文是国际象棋引擎。它是用 Java 编写的,在给定棋盘状态的情况下,它必须搜索下一个“最佳”棋步。因此,尽可能高效地实现所有内容非常重要,因为许多方法将被调用数百万次。因此,我想要这种 Rooks 层次结构,而不是一个 Rook 类,在 Rook 类中我必须检查 Rook 位于哪一侧,并检查 Rook 是否在其初始位置等。

Board刚创建时,会有一个ShortRook和一个LongRook。随着游戏的进行,可能会因为 Pawn 的提升而将更多的 Rooks 引入游戏中。这些将是 Rook 的实例。

只要移动 Rook,方法 voidCaSTLeRight() 就会被调用。由于 Pawn 升级而存在的 Rooks 不应在移动时使城堡无效(空方法)。自游戏开始以来就存在的车,移动时应使城堡权利无效(子类中的方法)。

我还编写了一个解析器,它接受 FENString 并将它们转换为 Board,反之亦然。当 Rooks 不在初始位置时,无法判断哪个是 Short-Rook 和 LongRook。这不是问题,因为城堡权利已经作废,它们可以解析为 Rook 的实例。因此,如果我将一个 Short- 或 LongRook 对象转换到 Rook,只要它使相关的城堡权利无效(即它已经移动),就可以了吗?这样它就不会在城堡已经作废时不必要地作废它。我不关心这些解析器方法的复杂性,因为它们不会用于搜索。

虽然有些人可能认为这些想法是“万恶之源”的微优化,但当方法必须被调用几百万次时,这些优化可能会得到返回。我也更关心 OOP 范式。

PS:我知道 Java 不是用于此应用程序的最佳语言,它无关紧要。我知道对象创建(在 Java 中)很昂贵。我将确保在搜索过程中不会创建任何对象。

最佳答案

虽然拥有一个什么都不做的空方法当然没问题,但您应该评估它的替代方案 - 一个完全缺失的空方法,即一个抽象方法。

这可能适用于您的情况,因为您将创建一个 ShortRook、一个 LongRook 或一个提升的 Rook:

public abstract class AbstractRook() {
    public abstract void voidCastleRight();
}

public class ShortRook() extends AbstractRook{
    @Override
    public void voidCastleRight() {
        getPlayer().setkSC(false); //void King Side Castling (Short Castle)
    }
}

public class LongRook() extends AbstractRook{
    @Override
    public void voidCastleRight() {
        getPlayer().setqSC(false); //void Queen Side Castling (Long Castle)
    }
}

public class PromotedRook() extends AbstractRook{
    @Override
    public void voidCastleRight() {
        throw new IllegalStateException("Promoted rook cannot castle");
    }
}

关于java - 有一个空方法可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30578440/

相关文章:

java - 如何实现比较?

PHP "Object"类

python - Tkinter:使用附加参数对 Button 进行子类化

swift - 自定义按钮不显示标题

C++如何调用子类函数

java - Firebase Java SDK 离线

java - 将 Oracle DB 中的时区偏移量作为单独的字段存储

java - Hibernate和Spring3事务管理注解-配置问题: Hibernate-Exception: No Hibernate Session bound to thread

oop - 数据拉取与推送 OOP 方法

Java继承覆盖实例变量