【问题标题】:Good design for accessing subclass methods in a vector of abstract class objects用于访问抽象类对象向量中的子类方法的良好设计
【发布时间】:2015-05-24 10:48:37
【问题描述】:

我正在使用向量来存储AnAbstractClass 超类的对象。抽象类只包含两个非构造方法:

public final String getName() {
    return name;
}

public abstract int getCost();

在每个子类中,我创建了一个getCost 方法。在anotherClass 中,我有抽象类对象的向量。在anotherClass 的方法中,我使用了一个字符串,该字符串包含名称、成本和其他特定于多个子类中的每一个的数据类型。我目前正在访问向量以检索 namecost 就好了。

但是,当我尝试访问特定于每个子类的其他字段(即:getColorgetSize 时,我遇到了以下编译错误:

Error: cannot find symbol
  symbol:   method <mySubClassMethod>()
  location: class <MyAbstractClass>

我怎样才能有效地设计解决这个困境的方案?

【问题讨论】:

    标签: java object inheritance vector abstract-class


    【解决方案1】:

    要访问特定于子类的方法,您需要强制转换为子类。

    例子:

    Subclass foo = (Subclass) myAnAbstractClassInstance;
    

    如果你不知道你有什么子类,你可以使用 instanceof 进行类型检查

    例子

    // Subclass implements size and color, but superclass does not
    if (foo instanceof Subclass) {
        Subclass foobar = (Subclass) foo;
        int size = foobar.size();
        String color = foobar.color();
    }
    

    替代解决方案: 1.让所有子类提供所有方法(即使它们什么都不做) 2.让所有子类都提供一个方法,让你知道它们支持什么方法

    【讨论】:

    • lmk 如果这不能回答你的问题
    【解决方案2】:

    将 getColor 和 getSize 添加到抽象类,或者如果您想要完全动态的东西,请尝试使用 getData() 之类的方法,该方法返回名称/值对的 Map。 如果您需要更动态的东西,请尝试使用 groovy 而不是 java。然后您就可以通过元编程摆脱困境!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多