十多年来我没有编写任何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.
Run Code Online (Sandbox Code Playgroud)
后来我使用迭代器来处理它们:
Iterator<Node> i = list.iterator();
Node n = i.next();
// How do I tell if n is a TagNode or a DataNode?
Run Code Online (Sandbox Code Playgroud)
我知道我可以转换到其中一个Node子类,但我怎么知道要使用哪个子类?我是否需要在Node类中嵌入类型信息?
在大多数情况下,您不应该知道哪个子类是哪个.
这正是多态性的优势.
如果您的层次结构设计是可靠的,那么Node将具有对您的List项执行操作所需的所有行为(==方法),而不必担心它们是哪个子类实例:重写方法在运行时解析.
在某些情况下,您可能希望使用instanceof运算符来实际检查class您Node所属的子项,但我认为这是一种罕见的情况,最好在一般原则中避免使用.
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |