首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向Java对象的象棋与效率

面向Java对象的象棋与效率
EN

Stack Overflow用户
提问于 2015-08-27 11:05:40
回答 5查看 1.1K关注 0票数 8

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

  • Rook部件需要实现在直线上移动。
  • 毕晓普片需要在对角线上移动的实现。

然而,

  • 女王的作品需要实现上述两种运动模式。

我想不出一个清晰的解决方案来建模这种关系,我已经考虑了一些,但它们都没有兼容良好的面向对象的设计和代码效率。

  1. Java不支持多重继承,所以Queen不能从Rook和Bishop那里借用实现
  2. 如果鲁克和毕晓普扩展了女王,我需要把每一种运动的逻辑提取成不同的方法,这会严重地膨胀我目前设计的运动是如何被验证的。

以上两种解决方案似乎都不够优雅,足以击败以下两种解决方案:

  1. 将所有的移动实现放入所有片段的父类中,这样它们都可以共享所有的公共实现(其中有相当多的)。

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

也许可以通过程序的完全重组来避免这种情况,但是到目前为止,在我看来,好的OO设计总是以功能和结构的直接性为代价的吗?我的方法对语言风格来说是错误的吗?

你将如何解决这个问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-08-27 11:11:54

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

例如,HumanCrab都可以横向移动,但是Human扩展Crab是很愚蠢的。

如果您真的想重用移动代码,可以使用封装,使用Movement类型并使其如下所示:

代码语言:javascript
复制
class Human
{
   List<Movement> movements;
}

class Crab
{
    List<Movement> movements;
}

class MoveSideWays extends Movement
{
      move();
}

class MoveForward extends Movement
{
      move();
}

但感觉像是过度工程了。我将有一个带有PiecegetPossibleMoves()类,并直接实现它。没有太多的重叠和鲁克斯有专门的动作(铸)以及。

代码语言:javascript
复制
class Rook extends Piece
{
   List<Move> getPossibleMoves()  {...}
}

class Queen extends Piece
{
   List<Move> getPossibleMoves() {...}
}
票数 10
EN

Stack Overflow用户

发布于 2015-08-27 11:13:29

您不应该将超类-子类关系添加到各个片段中。女王不是鲁克的特例,也不是王后的特例。它们只是不同的部分。您可以创建一个接口(或抽象类) Piece,并提供不同的实现,如RookBishopQueen等等。

票数 4
EN

Stack Overflow用户

发布于 2015-08-27 11:11:20

您可以将这两个方法移到超类中,但将它们设为protected static (也可以将这些方法放入PieceHelper中)。在子类中,您可以实现适当的方法,引用其中的一个或另一个方法(使它们为public)。

超级阶级:

代码语言:javascript
复制
abstract class Piece {
    protected static void moveStraight(Piece p) {...}
    protected static void moveDiagonal(Piece p) {...}
}

(可选)接口:

代码语言:javascript
复制
interface DiagonalMover {
     void moveDiagonal();
}
interface StraightMover {
     void moveStraight();
}

子类:

代码语言:javascript
复制
class Rook extends Piece implements StraightMover {
    public void moveStraight() {Piece.moveStraight(this);}
}
class Bishop extends Piece implements DiagonalMover {
    public void moveDiagonal() {Piece.moveDiagonal(this);}
}
class Queen extends Piece implements StraightMover, DiagonalMover {
    public void moveStraight() {Piece.moveStraight(this);}
    public void moveDiagonal() {Piece.moveDiagonal(this);}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32247718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档