【问题标题】:Accessing Methods specific to a "type" of class, in a collection在集合中访问特定于类“类型”的方法
【发布时间】:2013-03-24 19:57:26
【问题描述】:

情况:

  • 我有一个包含多种方法的抽象类:
  • 我有几个子类扩展了上面的类
  • 我有一个集合 <MyAbstractClass> 集合,其中填充了我的主类中子类的新对象
  • 我有一个子类的唯一方法,我希望以覆盖我通常调用的方法的方式执行该方法。

即如果条件为真,而不是通常的collection.get(i).method();(其中i 是索引),执行collection.get(i).specificMethod();

任何人都可以指出正确的主题来进一步研究吗?另外,稍微了解一下我的情况会产生奇迹。

【问题讨论】:

  • 重新考虑你的方法。在抽象类中创建一个方法,例如specificActions() 并在每个子类中实现。

标签: java inheritance collections methods abstract


【解决方案1】:

听起来你想要instanceof:

for (AbstractThing thing : yourCollection) {
    if (thing instanceof SubclassWithSpecialMethod) {
        ((SubclassWithSpecialMethod)thing).specialMethod();
    }
    else {
        thing.method();
    }
}

虽然instanceof 的使用完全合法,但如果您发现自己在使用它(尤其是在您经常使用它的情况下),它有时表明最好退后一步看大图看看是否有某种方法可以让你重新组织事情,这样你就不会这样做了。

在这种情况下,例如,抽象类可能具有method,然后具有特殊行为的子类可以覆盖 method 具有特殊行为,因此调用者只需调用@ 987654326@ 和多态性会在您处理特定子类时为其提供特殊行为。

【讨论】:

  • 您能否详细说明为什么在这种情况下使用 instanceOf 会是一个不明智的选择?对我来说听起来很完美
  • @TheJackal:我不是说不是。正如我所说,instanceof 有完全合法的用途,这很可能就是其中之一。这将完全取决于更大的背景。
  • 感谢 T.J 的洞察力
【解决方案2】:

检查method() 中的条件,如果满足,请从那里调用specificMethod()。根据您的描述,这仅适用于某些子类。

如果您正在检查外部条件,请将标志传递给 method() 以指示它是否应该调用同一实例的 specificMethod()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2018-01-29
    相关资源
    最近更新 更多