我已经十多年没有编写任何Java代码了。我很享受它,但我不认为我得到了多态编程的一些细节。我有一个抽象的Node类,它有标记和数据子类(以及其他),我将它们存储在ArrayList中。
但是当我通过Iterator将它们从ArrayList中取出时,我得到了Node对象。我不确定如何最好地处理从迭代器返回的对象。
以下是一个例子:
// initialize the list
TagNode tag = new TagNode();
ArrayList<Node> list = new ArrayList<>();
list.add(tag);
// And many more go into the list, some TagNodes, some DataNodes, etc.
以后我使用迭代器来处理它们:
Iterator<Node> i = list.iterator();
Node n = i.next();
// How do I tell if n is a TagNode or a DataNode?
我知道我可以转换到其中一个Node子类,但我怎么知道要使用哪个子类?我是否需要在Node类中嵌入类型信息?
答案 0 :(得分:5)
在大多数情况下,您不应该知道哪个子类是哪个。
这正是多态性的优势。
如果您的层次结构设计是可靠的,Node
将拥有对List
项执行操作所需的所有行为(==方法),而不必担心它们是哪个子类的实例:重写的方法在运行时解析。
在某些情况下,您可能希望使用instanceof
运算符来实际检查class
所属的Node
个孩子,但我认为这是一种罕见的情况,最好是避免一般原则。
答案 1 :(得分:1)
理想情况下,您是don't want to treat them differently,但如果您想确定类型,可以使用instanceof进行检查:
Node n = i.next();
if (n instanceof Tag) {
// behavior
}
答案 2 :(得分:0)
正如其他人所说,明确检查对象所属的子类是不必要的,也是一种不好的风格。但如果您真的需要它,可以使用instanceof
operator。
答案 3 :(得分:0)
多态行为意味着如果你知道它是什么类型的Node
,你真的不在乎。您只需调用API,行为将按照具体类型的实现进行。
但如果您真的需要知道,其中一种方法是使用instanceof
来确定哪种类型。例如,
if( i instanceof tag )
// handle tag
else if( i instanceof data)
//handle data