背景
我正在用Java建立国际象棋程序。
问题
我创建了一个名为IPiece
的接口类型:
public interface IPiece
{
boolean isFriendlyTo(IPiece piece);
Square[] destinationsFrom(IBasicBoard onBoard, Square fromSquare);
}
我正在实施它:
public abstract class AbstractChessPiece implements IPiece
{
private PieceArchetype pieceArchetype;
private Color color;
public AbstractChessPiece(PieceArchetype pieceArchetype, Color color)
{
this.pieceArchetype = pieceArchetype;
this.color = color;
}
public PieceArchetype archetype()
{
return this.pieceArchetype;
}
public Color color()
{
return this.color;
}
@Override
public boolean isFriendlyTo(IPiece piece)
{
if(this.equals(piece))
return true;
return this.isFriendlyTo((AbstractChessPiece) piece);
}
public boolean isFriendlyTo(AbstractChessPiece piece)
{
return this.color() == piece.color();
}
@Override
public abstract Square[] destinationsFrom(IBasicBoard onBoard, Square fromSquare);
}
我对isFriendlyTo(IPiece)
方法提出的问题。将此方法包含在IPiece
接口中是不是一个糟糕的设计,因为它需要对任何派生类型进行强制转换。没有强制转换就无法计算结果。这看起来很尴尬。在涉及施法时,我总是第二次猜测设计。
答案 0 :(得分:3)
如果您真的想保留此接口结构,可以在接口中添加泛型类型。它定义了哪些部分可能是敌对的。这是Comparable
接口的作用,并且工作方式如下:
public interface IPiece<E> {
boolean isFriendlyTo(E piece);
...
}
public abstract class AbstractChessPiece implements IPiece<AbstractChessPiece> {
...
@Override
public boolean isFriendlyTo(AbstractChessPiece piece) {
return this.color() == piece.color();
}
...
}
然而,我会使用wakjah并建议界面声明getColor
或getPlayer
方法。
如果它们以某种方式相互交互(例如,棋子棋子和棋子可能会突然一起玩),你应该只在两种不同的情况下使用相同的界面。在你的情况下,似乎游戏机制是完全不相交的,所以使用不同的界面是有意义的。
如果您使用相同的代码为两个游戏渲染图形,那么您可以定义另一个不包含游戏方法的界面,例如isFriendlyTo
。这将分离共享图形功能,形成不相交的游戏功能。