java - 如何实现类列表中不常见的方法/接口(interface)?

标签 java inheritance interface java-7

假设我有一个名为 Element 的类,它是所有类型元素的父类(super class); WallDoorPickupTable等。现在假设,其中一些子类可以通过通过 use() 方法获得 Player 实例,但其他方法则不能。所有元素中只有 1-5% 可用。我将如何以面向对象的方式实现它?

我考虑了以下选项:

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

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

最佳答案

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

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");
}

关于java - 如何实现类列表中不常见的方法/接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20692945/

相关文章:

java - 按钮代码使应用崩溃(重复)

java - 使用 java 进行 Sparql 查询

java - 在接口(interface)中返回等于无的东西

java - HTTP 请求在 Tomcat 关闭期间被阻止

java - S3生成下载链接

java - Java中synchronized是继承的吗?

java - 有没有办法在调用的时候不调用子类的方法?

c# - 通用约束和继承

HashSet 或其他实现的 Java 变量类型集合?

C++ 通过继承实现的基于组件的架构被认为是好的做法吗?