面向对象与效率
我正在开发一个Java程序并考虑以下问题:
然而,
我想不出一个干净的解决方案来建模这种关系,我曾经考虑过一些,但没有一个都符合良好的面向对象的设计和高效的代码。
Java不支持多重继承,因此Queen不能借用Rook和Bishop的实现
如果Rook和Bishop延长皇后,我需要将每种运动的逻辑提取为单独的方法,这将严重膨胀我目前的运动验证设计。
上述两种解决方案都不够优雅,无法击败:
我知道解决方案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()
来getPossibleMoves()
一个Piece
类,并直接实现它。 没有太多重叠,Rooks也有专门的动作(Castling)。
class Rook extends Piece
{
List<Move> getPossibleMoves() {...}
}
class Queen extends Piece
{
List<Move> getPossibleMoves() {...}
}
您不应该将超类 - 子类关系添加到各个部分。 女王不是白嘴鸦的特例,白嘴鸦也不是女王的特例。 他们只是不同的部分。 你可以创建一个接口(或一个抽象类) Piece
并提供Rook
, Bishop
, Queen
等不同的实现。
你可以将两个方法都移动到超类,但是使它们保持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);}
}
链接地址: http://www.djcxy.com/p/84623.html