我正在用Java开发一个国际象棋程序,并考虑以下问题:
然而,
我想不出一个清晰的解决方案来建模这种关系,我已经考虑了一些,但它们都没有兼容良好的面向对象的设计和代码效率。
以上两种解决方案似乎都不够优雅,足以击败以下两种解决方案:
我知道解决方案3违反了良好的Java设计,但在这种情况下,这种设计模式似乎只会迫使臃肿、不优雅的解决方案。
也许可以通过程序的完全重组来避免这种情况,但是到目前为止,在我看来,好的OO设计总是以功能和结构的直接性为代价的吗?我的方法对语言风格来说是错误的吗?
你将如何解决这个问题?
发布于 2015-08-27 11:11:54
虽然某些类可能以类似的方式运行,但这并不意味着它们在一个层次结构中!。
例如,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();
}但感觉像是过度工程了。我将有一个带有Piece的getPossibleMoves()类,并直接实现它。没有太多的重叠和鲁克斯有专门的动作(铸)以及。
class Rook extends Piece
{
List<Move> getPossibleMoves() {...}
}
class Queen extends Piece
{
List<Move> getPossibleMoves() {...}
}发布于 2015-08-27 11:13:29
您不应该将超类-子类关系添加到各个片段中。女王不是鲁克的特例,也不是王后的特例。它们只是不同的部分。您可以创建一个接口(或抽象类) Piece,并提供不同的实现,如Rook、Bishop、Queen等等。
发布于 2015-08-27 11:11:20
您可以将这两个方法移到超类中,但将它们设为protected static (也可以将这些方法放入PieceHelper中)。在子类中,您可以实现适当的方法,引用其中的一个或另一个方法(使它们为public)。
超级阶级:
abstract class Piece {
protected static void moveStraight(Piece p) {...}
protected static void moveDiagonal(Piece p) {...}
}(可选)接口:
interface DiagonalMover {
void moveDiagonal();
}
interface StraightMover {
void moveStraight();
}子类:
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);}
}https://stackoverflow.com/questions/32247718
复制相似问题