gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:50:00 24 4
gpt4 key购买 nike

我有一个设计问题,我无法弄清楚如何解决。基本上我使用访问者来更新某个类的实例。我希望将来能够实现不同类型的更新,作为我的 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<A> 中,我想对每个对象应用最具体的更新。但是,当我尝试将更新应用于列表的元素之一时,我总是得到 visit(A)称为,而不是更具体的。我想那是因为它是 List<A> , 不是 List<B>List<C> ,但我希望多态性能够解决这个问题。我不能只删除 visit(A)运算符,因为有时不区分 C 和 B 是有意义的。你知道如何在没有 visit(A) 的情况下解决这个问题吗?将消息分派(dispatch)给它的重载?

谢谢

最佳答案

你必须重写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);
}
}

关于java - 如何重载方法来处理 Java 中参数的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com