我正在用 Java 开发国际象棋程序并考虑以下问题:
- Rook 部分需要实现直线移动。
- Bishop 部分需要实现沿对角线移动。
但是,
- Queen piece 需要实现上述两种运动模式。
我想不出一个干净的解决方案来为这种关系建模,我考虑了一些,但没有一个既符合良好的面向对象设计又代码效率。
Java不支持多重继承,所以Queen不能借用Rook和Bishop的实现
如果 Rook 和 Bishop 扩展了 Queen,我需要将每种移动的逻辑提取到单独的方法中,这会严重膨胀我当前关于如何验证移动的设计。
上述解决方案都不够优雅,无法击败:
- 将所有运动实现放入所有部件的父类中,这样它们就可以共享所有通用实现(其中有很多)
我知道解决方案 3 违反了良好的 Java 设计,但在这种情况下,该设计模式似乎只会强制使用臃肿、不优雅的解决方案。
也许这可以通过完全重组程序来避免,但到目前为止的一切对我来说看起来都非常有效,良好的 OO 设计是否总是以功能和结构的直接性为代价?我的方法对语言风格来说是错误的吗?
你会如何解决这个问题?
最佳答案
虽然某些类可能以类似的方式运行,但这并不自动意味着它们在一个层次结构中!
例如,Human
和 Crab
都可以侧身移动,但是 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/