【发布时间】:2015-06-01 16:21:55
【问题描述】:
是否可以有一个空方法并在其子类中覆盖它? 这就是它在我的代码中的样子。
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 是否在其初始位置等。
第一次创建 Board 时,会有一个 ShortRook 和一个 LongRook。随着游戏的进行,由于 Pawn 的提升,可能会在游戏中引入更多的 Rook。这些将是 Rook 的实例化。
每当移动 Rook 时,都会调用方法 voidCastleRight()。由于 Pawn 提升而存在的 Rooks 不应在移动时立即使城堡无效(清空方法)。从游戏开始就存在的 Rooks 在移动时应该使城堡权利无效(子类中的方法)。
我还编写了一个解析器,它接受 FENStrings 并将它们转换为 Board,反之亦然。当 Rooks 不在其初始位置时,无法区分 Short-Rook 和 LongRook。这不是问题,因为城堡的权利已经无效,它们可以被解析为 Rook 的实例。因此,如果我在 Rook 使相关城堡权利无效(即它已移动)时将 Short- 或 LongRook 对象投射到 Rook 上是否可以?这样一来,它就不会在城堡已经无效时不必要地无效了。我不关心这些解析器方法的复杂性,因为它们不会用于搜索。
虽然有些人可能会认为这些想法是微优化“这是万恶之源”,但当方法必须被调用几百万次时,这些优化可能会得到回报。我也更关心 OOP 范式。
PS:我知道 Java 不是用于此应用程序的最佳语言,它无关紧要。我知道对象创建(在 Java 中)很昂贵。我会确保在搜索过程中没有创建任何对象。
【问题讨论】:
-
当然,为什么不呢。此外,在 Java 中创建对象并不是很昂贵。
-
我同意。 Java 中的对象创建并不昂贵。你不妨说 Java 很贵。
-
Rook可以直接实例化还是必须继承?在字母大小写中,您可以将其抽象化。 -
我知道 Java 不是用于此应用程序的最佳语言,它无关紧要。我知道对象创建(在 Java 中)很昂贵。我会确保在搜索过程中没有创建任何对象看起来你生活在 10 年前或更长时间。
-
随机附注(如果您仍在处理此问题)- 将
voidCastleRight()重命名为disableCastleRight或类似名称,因为void是 Java 中的关键字。这不会引发错误,但会降低可读性...
标签: java oop subclass hierarchy chess