与声明类型相同接口类型的参数的接口方法

时间:2013-10-19 19:00:50

标签: java oop interface casting

背景

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

1 个答案:

答案 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并建议界面声明getColorgetPlayer方法。

如果它们以某种方式相互交互(例如,棋子棋子和棋子可能会突然一起玩),你应该只在两种不同的情况下使用相同的界面。在你的情况下,似乎游戏机制是完全不相交的,所以使用不同的界面是有意义的。

如果您使用相同的代码为两个游戏渲染图形,那么您可以定义另一个不包含游戏方法的界面,例如isFriendlyTo。这将分离共享图形功能,形成不相交的游戏功能。