我正在使用一个向量来存储AnAbstractClass
超类的对象。抽象类只包含两个非构造函数方法:
public final String getName() {
return name;
}
public abstract int getCost();
在每个子类中,我创建了一个getCost
方法。在anotherClass
中,我有抽象类对象的向量。在anotherClass
的方法中,我使用了一个字符串,其中包含名称、成本和其他特定于多个子类的数据类型。我目前正在访问向量以检索name
和cost
。
然而,当我试图访问其他字段(即:特定于每个子类的getColor
或getSize
)时,我会遇到以下编译错误:
Error: cannot find symbol
symbol: method <mySubClassMethod>()
location: class <MyAbstractClass>
如何有效地设计解决这一困境的方案?
要访问特定于子类的方法,需要转换到子类。
示例:
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.让所有子类都提供一个方法,让你知道它们支持的方法
将getColor和getSize添加到抽象类中,或者如果您想要完全动态的东西,可以尝试使用getData()这样的方法,该方法返回名称/值对的Map。如果您需要更动态的东西,请尝试使用groovy而不是java。然后你就可以通过元程序摆脱任何困境!