Java中的国际象棋 - 面向对象与效率

Dav*_*ood 7 java oop chess

我正在用Java开发一个国际象棋程序并考虑以下问题:

  • Rook片需要实现直线移动.
  • Bishop部分要求实施对角线移动.

然而,

  • 女王片需要实现上述两种运动模式.

我不能想到建立这种关系的干净解决方案,我已经考虑了一些,但它们都没有兼容良好的面向对象设计代码高效.

  1. Java不支持多重继承,因此Queen无法借用Rook和Bishop的实现

  2. 如果Rook和Bishop扩展了Queen,我需要将每种运动的逻辑提取到单独的方法中,这将严重影响我目前的设计如何验证运动.

以上解决方案似乎都不够优雅,只能击败:

  1. 将所有移动实现放入所有部分的父类中,这样他们都可以共享所有常见的实现(其中有很多)

我知道解决方案3违反了良好的Java设计,但在这种情况下,该设计模式似乎只是强制臃肿,不优雅的解决方案.

可能通过对程序进行全面重组可以避免这种情况,但到目前为止,一切看起来都非常有效,优秀的OO设计是否总是以功能和结构的直接性为代价?我的方法对于语言的风格是错误的吗?

你会如何解决这个问题?

Rob*_*bAu 9

虽然某些类可能以类似的方式运行,但这并不意味着它们在一个层次结构中!

例如,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)

  • 我同意,我宁愿制作一个"运动"而不是棋子的等级 (2认同)