0

背景

我正在用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接口中是不是一个糟糕的设计,因为它需要对任何派生类型进行强制转换。没有强制转换就无法计算结果。只是看起来很尴尬。当涉及到铸造时,我总是第二次猜测设计。

4

1 回答 1

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. 这会将共享图形功能与不相交的游戏功能分开。

于 2013-10-19T19:37:12.227 回答