我想使用访问者模式来实现树。所以我创建了一个主类Node
和其他扩展该类的类(例如Node1
,Node2
,Node3
)。在Node
中,我有一个字符串和一个ArrayList
Nodes
,它是该节点的子节点列表。所以我实现了一个包含3个函数visit(Node1 x)
的访问者,...在main
中我想要接受每个节点:
SomeVisitor v = new SomeVisitor();
Node n = makeTree();
Iterator<? extends Node> it = n.children.iterator();
while(it.hasNext()) {
System.out.println(it.next().getClass());
it.next.accept(v);
}
这不起作用,因为即使.getClass
返回特定的类
我的意思是节点1,2或3,我得到的错误是it.next
是一种类型
节点,但我的树中没有任何节点对象,我没有实现
visit(Node)
仅visit(Node 1,2,3)
答案 0 :(得分:2)
检查visitor pattern的说明。 accept方法应该在基类中声明,每个子类都应该通过调用相应的visit方法来覆盖它:
public abstract class Node {
public abstract void accept(Visitor v);
}
public class Node1 extends Node {
@Override
public void accept(Visitor v) {
v.visit(this); // calls visit(Node1)
}
}
答案 1 :(得分:0)
您的解决方案是使用访问者模式,这不是您似乎正在做的事情。
我没有实现访问(Node)访问(节点1,2,3)
这是你的问题。您必须使用与您调用的方法相同的方法实现相同的接口。
你还需要把它写成
v.visit(it.next());
@JB Nizet的解决方案类似,但我认为以一种从一开始就需要调用的方式编写代码更简单。
答案 2 :(得分:0)
很难猜出你的问题在哪里。您应该看一下wikipedia上的示例实现。正如您将看到的那样,使用扩展而不是使用装饰接口来实现模式。