在抽象类对象的向量中访问子类方法的好设计

时间:2015-03-20 22:03:07

标签: java object inheritance vector abstract-class

我使用向量来存储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>

如何有效地设计解决这一难题的解决方案?

2 个答案:

答案 0 :(得分:0)

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

示例:

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.让所有子类提供一种方法,让您知道它们支持哪些方法

答案 1 :(得分:0)

将getColor和getSize添加到抽象类中,或者如果您想要完全动态的东西,请尝试使用getData()这样的方法返回名称/值对的Map。 如果你需要更动态的东西,请尝试使用groovy而不是java。那么你可以通过MetaProgram摆脱任何困境!