java - Java 国际象棋——面向对象与效率

标签 java oop chess

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

  • Rook 部分需要实现直线移动。
  • Bishop 部分需要实现沿对角线移动。

但是,

  • Queen piece 需要实现上述两种运动模式。

我想不出一个干净的解决方案来为这种关系建模,我考虑了一些,但没有一个既符合良好的面向对象设计代码效率。

  1. Java不支持多重继承,所以Queen不能借用Rook和Bishop的实现

  2. 如果 Rook 和 Bishop 扩展了 Queen,我需要将每种移动的逻辑提取到单独的方法中,这会严重膨胀我当前关于如何验证移动的设计。

上述解决方案都不够优雅,无法击败:

  1. 将所有运动实现放入所有部件的父类中,这样它们就可以共享所有通用实现(其中有很多)

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

也许这可以通过完全重组程序来避免,但到目前为止的一切对我来说看起来都非常有效,良好的 OO 设计是否总是以功能和结构的直接性为代价?我的方法对语言风格来说是错误的吗?

你会如何解决这个问题?

最佳答案

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

例如,HumanCrab 都可以侧身移动,但是 Human 扩展 Crab 是愚蠢的

如果你真的想重用移动代码,你可以使用封装,使用Movement类型,然后像这样:

class Human
{
   List<Movement> movements;
}

class Crab
{
    List<Movement> movements;
}

class MoveSideWays extends Movement
{
      move();
}

class MoveForward extends Movement
{
      move();
}

但这感觉像是过度设计。我会有一个带有 getPossibleMoves()Piece 类,然后直接实现它。没有太多重叠,Rooks 也有专门的 Action (Casling)。

class Rook extends Piece
{
   List<Move> getPossibleMoves()  {...}
}

class Queen extends Piece
{
   List<Move> getPossibleMoves() {...}
}

关于java - Java 国际象棋——面向对象与效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247718/

相关文章:

java - 递归调用方法

java - Java 中的页面过期(Wicket)

oop - 为什么 OO 语言真的需要 PROTECTED 访问修饰符?

javascript - React中Chessboardjs NPM包,referenceError $ is not Defined

algorithm - 国际象棋 - 在防止检查时避免无限递归

java - 在 for 循环中将时间线关键帧与 JavaFX 结合使用

java - 如何在 Java 中的 Stack/Queue 类中实现通用 LinkedList

java - 如何不扩展 Swing 组件?

java - DAO 中的搜索方法类似于 SQL 的 LIKE

c++ - opengl中的棋盘