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



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

如何有效地设计解决这一困境的方案?

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

示例:

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。然后你就可以通过元程序摆脱任何困境!

相关内容

最新更新