【问题标题】:How to implement infrequent method/interface in list of classes?如何在类列表中实现不常用的方法/接口?
【发布时间】:2013-12-19 22:29:17
【问题描述】:

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

我考虑了以下选项:

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

谁有更好的解决方案?

【问题讨论】:

  • 我的第一反应是让子类实现Usable 接口,正如你所提到的。这有什么问题?

标签: java inheritance interface java-7


【解决方案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");
}

【讨论】:

  • 感谢您的回答!我忘了明确提到可用性取决于类,而不是类对象。对于您的(第一个)解决方案;如果我有一个很大的世界元素数组列表,其中只有 1% 可用,那么在循环遍历元素列表以搜索最佳可用候选对象时,这不会产生很大的开销吗?
  • 要获得好的答案,您必须描述您的问题。你有多少元素。算法应该做什么?什么是候选人,您如何寻找最佳候选人?编辑您的问题。
  • 我不是很好地描述了这个问题吗?元素(子类)的实例数量可以在 50-1000 之间,具体取决于世界的大小。只有 5-30 个对象是可用子类的实例。在某个时刻,当需要进行某个使用动作时,玩家可触及的对象为候选对象,而最佳候选对象将是最接近玩家的对象。感谢您抽出宝贵时间回答我的问题!
  • 迭代 1000 多个元素非常快。如果速度不够快,您可以维护一个额外的可用对象集合。
猜你喜欢
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2012-11-30
  • 2021-11-30
  • 2016-02-19
  • 1970-01-01
相关资源
最近更新 更多