我正在用Java开发一个国际象棋程序并考虑以下问题:
然而,
我不能想到建立这种关系的干净解决方案,我已经考虑了一些,但它们都没有兼容良好的面向对象设计和代码高效.
Java不支持多重继承,因此Queen无法借用Rook和Bishop的实现
如果Rook和Bishop扩展了Queen,我需要将每种运动的逻辑提取到单独的方法中,这将严重影响我目前的设计如何验证运动.
以上解决方案似乎都不够优雅,只能击败:
我知道解决方案3违反了良好的Java设计,但在这种情况下,该设计模式似乎只是强制臃肿,不优雅的解决方案.
可能通过对程序进行全面重组可以避免这种情况,但到目前为止,一切看起来都非常有效,优秀的OO设计是否总是以功能和结构的直接性为代价?我的方法对于语言的风格是错误的吗?
你会如何解决这个问题?
虽然某些类可能以类似的方式运行,但这并不意味着它们在一个层次结构中!
例如,a Human和a Crab都可以横向移动,但Human延伸是愚蠢的Crab.
如果你真的想重新使用移动代码,你可以使用封装,使用Movement类型并使它像这样:
class Human
{
List<Movement> movements;
}
class Crab
{
List<Movement> movements;
}
class MoveSideWays extends Movement
{
move();
}
class MoveForward extends Movement
{
move();
}
Run Code Online (Sandbox Code Playgroud)
但感觉就像是过度工程化.我会有一个Piece课程,getPossibleMoves()直接实现它.没有太多重叠,鲁克斯也有专门的动作(Castling).
class Rook extends Piece
{
List<Move> getPossibleMoves() {...}
}
class Queen extends Piece
{
List<Move> getPossibleMoves() {...}
}
Run Code Online (Sandbox Code Playgroud)