如何在类列表中实现不频繁的方法/接口?

时间:2013-12-19 22:29:17

标签: java inheritance interface java-7

假设我有一个名为 Element 的类,它是各种元素的超类; 取件等等。现在假设,其中一些子类可以通过以下方式进行交互通过 use()方法的播放器的实例,但其他人则不能。只有1-5%的元素可以使用。我将如何以面向对象的方式实现它?

我考虑过以下几种选择:

  • 元素可以包含一个可覆盖的 use()方法,该方法可以被每个子类覆盖。这很容易实现,但要求玩家在与世界交互时从许多对象中检查 use()方法。
  • 某些子类可以实现可用接口,该接口定义 use()方法。这要求程序跟踪至少两个列表,一个用于元素,一个用于可用
  • 元素使用一个列表,并使用 instanceof 运算符检查可用性。真的?

有没有人有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

如果可用性取决于类,而不取决于对象的实例,则可以在基类中简单地提供这两种方法:

public boolean isUsable() {
    return false;
}

public void use() {
    if (isUsable()) {
        throw new IllegalStateException("subclass must override use() if it's usable");
    }
    throw new UnsupportedOperationException("Not usable I told you");
}

现在想要使用的子类只需要覆盖这两个方法。

如果可用性取决于实例,那么您可以使用标志:

private final boolean usable;

protected Element(boolean usable) {
    this.usable = usable;
}

public final boolean isUsable() {
    return usable;
}

public final void use() {
    if (!isUsable()) {
        throw new UnsupportedOperationException("Not usable I told you");
    }
    doUse();
}

protected void doUse() {
    throw new IllegalStateException("subclass that can be usable must override doUse");
}