在抽象 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 的数据类型。我目前正在访问向量以检索 name
和 cost
就好了。
但是,当我尝试访问其他字段(即:getColor
或 getSize
特定于每个子 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 走出困境!
我正在使用向量来存储 AnAbstractClass
superclass 的对象。摘要 class 只包含两个非构造方法:
public final String getName() {
return name;
}
public abstract int getCost();
在每个子class 中我创建了一个getCost
方法。在 anotherClass
中,我有抽象 class 对象的向量。在 anotherClass
的方法中,我使用了一个字符串,其中包含名称、成本和其他特定于每个多个子 class 的数据类型。我目前正在访问向量以检索 name
和 cost
就好了。
但是,当我尝试访问其他字段(即:getColor
或 getSize
特定于每个子 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 走出困境!