如何重载Java中的方法来处理参数的子类?

发布于 2025-01-04 21:43:32 字数 864 浏览 0 评论 0原文

我有一个设计问题,我不知道如何解决。基本上我使用访问者来更新某个类的实例。我希望将来能够实现不同类型的更新,作为我的 Update 类的扩展。我还希望能够更新不同类型的对象(全部派生自基类)。所以我有:

public class Update
{
    public void visit(A obj) { /* generic */ }
    public void visit(B obj) { /* specific for B */ }
    public void visit(C obj) { /* specific for C */ }
}

public class A 
{
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class B extends A { /* ... */ }

public class C extends A { /* ... */ }

我的实例位于 List 中,并且我想对每个对象应用最具体的更新。但是,当我尝试将更新应用于列表的元素之一时,我总是会调用 visit(A),而不是更具体的调用。我想这是因为它是 List,而不是 ListList,但我希望多态性能够得到照顾的。我不能只删除 visit(A) 运算符,因为有时不区分 C 和 B 是有意义的。您知道如何在没有 的情况下解决这个问题吗? Visit(A) 将消息分派给它的重载?

谢谢

I have a design issue which I can't just figure out how to solve. Basically I am using a visitor to update instances of a certain class. I want to be able to implement different kind of updates in the future, as extension of my Update class. I also want to be able to update different kinds of objects (all derived from the base class). So I have:

public class Update
{
    public void visit(A obj) { /* generic */ }
    public void visit(B obj) { /* specific for B */ }
    public void visit(C obj) { /* specific for C */ }
}

public class A 
{
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class B extends A { /* ... */ }

public class C extends A { /* ... */ }

I have my instances in a List<A>, and I want to apply the most specific update to each object. However, when I try to apply the Update to one of the list's element I always get visit(A) called, instead than more specific ones. I guess that's because it's List<A>, not List<B> or List<C>, but I would expect polymorphism to take care of that. I can't just remove the visit(A) operator, because sometimes it makes sense not to make any distinction between C and B. Do you have any idea about how to solve this without having visit(A) dispatch the message to its overloads?

Thank you

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

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

发布评论

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

评论(1

落墨 2025-01-11 21:43:32

您必须重写 accept 方法

public class Update
{
    public void visit(A obj) { /* generic */ }
    public void visit(B obj) { /* specific for B */ }
    public void visit(C obj) { /* specific for C */ }
}

public class A 
{
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class B extends A {
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class C extends A { 
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

You have to override the accept method

public class Update
{
    public void visit(A obj) { /* generic */ }
    public void visit(B obj) { /* specific for B */ }
    public void visit(C obj) { /* specific for C */ }
}

public class A 
{
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class B extends A {
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class C extends A { 
    public void accept(Update u) 
    {
        u.visit(this);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文