gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:09:47 26 4
gpt4 key购买 nike

我正在用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com