访问者模式接受不识别对象的类

发布于 2024-12-23 12:27:09 字数 718 浏览 1 评论 0原文

我想使用访问者模式来实现一棵树。因此,我创建了一个主类 Node 和扩展该类的其他类(例如 Node1Node2Node3 )。在Node中,我有一个字符串和一个NodesArrayList,它是该节点的子节点列表。因此,我实现了一个具有 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 返回一个特定的类 我的意思是 Node 1 、 2 或 3 ,我得到的错误是 it.next 是一种类型 节点,但我的树中没有任何节点对象,并且我没有实现 访问(节点) 只是访问(节点1,2,3)

I want to use the visitor pattern to implement a tree. So I made a main class Node and other classes that extends that class (for example Node1, Node2, Node3). In Node I have a String and an ArrayList of Nodes which is a list of children of that node. So I implemented a visitor with 3 functions visit(Node1 x), ... and in main I want to call accept of every node:

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); 
}

this doesn't work because even though .getClass returns a specific class
I mean Node 1 , 2 or 3 and the error I get is that is it.next is a type
node but I don't have any node object in my tree , and I didn't implement
visit(Node) just visit(Node 1,2,3)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

饭团 2024-12-30 12:27:09

检查访问者模式的描述。应该在基类中声明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)
    }
}

Check the description of the visitor pattern. The accept method should be declared in the base class, and each subclass should override it by calling back the appropriate visit method:

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)
    }
}
爱的那么颓废 2024-12-30 12:27:09

很难猜测你的问题出在哪里。您应该看一下 wikipedia 上的示例实现。正如您将看到的,该模式不是通过使用扩展来实现的,而是通过使用装饰接口来实现的。

It's hard to guess where your problem is. You should have a look at a sample implementation like the one on wikipedia. As you will see there the pattern is not implemented by using extension but by using decorating interfaces.

下雨或天晴 2024-12-30 12:27:09

您的解决方案是使用访问者模式,但这不是您似乎正在做的事情。

我没有实现访问(Node),只是访问(Node 1,2,3)

这是你的问题。您必须使用您所调用的相同方法来实现相同的接口。

您还需要将其编写为

v.visit(it.next());

@JB Nizet 的解决方案类似,但我认为以从一开始就需要调用的方式编写代码更简单。

Your solution is to use the visitor pattern, which is not what you appear to be doing.

I didn't implement visit(Node) just visit(Node 1,2,3)

This is your problem. You have to implement the same interface with the same method which what you call.

Also you need to write it as

v.visit(it.next());

@JB Nizet's solution is similar, but I think its simpler to write the code in the manner it needs to be called from the start.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文