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

时间:2012-02-13 02:34:00

标签: java polymorphism late-binding visitor-pattern

我有一个设计问题,我不能弄清楚如何解决。基本上我使用访问者来更新某个类的实例。我希望将来能够实现不同类型的更新,作为我的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)将消息发送给您,您是否知道如何解决此问题?它的重载?

谢谢

1 个答案:

答案 0 :(得分:4)

您必须覆盖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);
    }
}