在抽象 class 对象的向量中访问 subclass 方法的良好设计

Good design for accessing subclass methods in a vector of abstract class objects

我正在使用向量来存储 AnAbstractClass superclass 的对象。摘要 class 只包含两个非构造方法:

public final String getName() {
    return name;
}

public abstract int getCost();

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

但是,当我尝试访问其他字段(即:getColorgetSize 特定于每个子 class 我 运行 进入以下编译错误:

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 添加到抽象 class,或者如果您想要完全动态的东西,请尝试使用像 getData() 这样的方法,其中 returns 一个 name/value 对的映射. 如果您需要更动态的东西,请尝试使用 groovy 而不是 java。然后你就可以通过 MetaProgram 走出困境!