java - 具有与声明类型相同的接口(interface)类型的参数的接口(interface)方法

标签 java oop interface casting

背景

我正在用 Java 构建一个国际象棋程序。

问题

我创建了一个名为 IPiece 的接口(interface)类型:

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

最佳答案

如果您确实想保留此接口(interface)结构,您可以向接口(interface)添加泛型类型。它定义了它可以敌对哪些棋子。这就是 Comparable 接口(interface)的作用,其工作原理如下:

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,并建议该接口(interface)声明一个 getColorgetPlayer 方法。

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

如果您使用相同的代码来渲染两个游戏的图形,那么您可以定义另一个不包含游戏方法的接口(interface),例如 isFriendlyTo。这会将共享图形功能与不相交的游戏功能分开。

关于java - 具有与声明类型相同的接口(interface)类型的参数的接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469850/

相关文章:

java - SwingWorker 中 setProgress 的无法解释的行为

java - 为什么我的子类不继承其父类(super class)的私有(private)实例变量?

c# - 将接口(interface)的事件从 VB.Net 转换为 C#

java - 是否可以使用接口(interface)与java中的另一个类对话?

python - 如何获得实现接口(interface)的类列表? (zope.interface)

java - 如何在javafx Textarea中突出显示文本?

Java 正则表达式 : Find returns true but one of the group() fails to return value

java - 从 Java 使用命令行参数调用 C 程序

oop - 并行继承定义的具体例子

c++ - 有没有一种方法可以复制派生类指针的 vector 而不将其强制转换为基类?