有空方法可以吗?

Aub*_*ron 6 java oop chess subclass hierarchy

是否可以使用空方法并在子类中重写它?这就是我的代码中的样子.

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

上下文是国际象棋引擎.它是用Java编写的,它必须搜索下一个"最佳"移动,以便给出一个状态.因此,一切都尽可能高效地实施是很重要的,因为许多方法将被称为数百万次.因此,我想要这个Rooks的等级,而不是一个Rook类,我必须检查Rook在哪一侧并检查Rook是否处于其初始位置等等.

首次创建Board时,会有ShortRook和LongRook.随着游戏的进行,有可能因为典当促销而将更多的白嘴鸦引入游戏中.这些将是鲁克的实例.

voidCastleRight()每当移动Rook时都会调用该方法.由于Pawn升级而存在的车辆不应该在移动时使城堡无效(空方法).自游戏开始以来存在的鲁克斯应该在移动时使城堡权利无效(子类中的方法).

我还编写了一个解析器,它接受FENStrings并将它们转换为Board,反之亦然.当鲁克斯不在他们的初始位置时,没有办法分辨出Short-LongRook和LongRook.这不是问题,因为无论如何城堡权利已经废除,它们可以被解析为鲁克的实例.因此,如果我将一个Short或LongRook对象输入Rook,只要它已经使相关的城堡无效(即它已经移动),那么它会没有问题吗?通过这种方式,当城堡已经无效时,它不会毫无疑问地无效.我不关心这些解析器方法的复杂性,因为它们不会在搜索中使用.

虽然有些人可能会认为这些想法是微观优化"这是所有邪恶的根源",但是当这种方法被称为几百万次时,这些优化可能会得到回报.我也更关注OOP范式.

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

das*_*ght 5

虽然拥有一个什么都不做的空方法肯定是可以的,但是你应该评估它的替代方法 - 一个完全缺失的空方法,即一个抽象方法.

这可能适用于您的情况,因为您将创建一个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");
    }
}
Run Code Online (Sandbox Code Playgroud)