【问题标题】:How to overload a method to handle parameter's subclasses in Java?如何重载一个方法来处理Java中参数的子类?
【发布时间】:2012-02-13 02:33:59
【问题描述】:

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

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) 将消息发送到其重载的情况下解决这个问题吗?

谢谢

【问题讨论】:

  • 您是否也在BC 中定义了accept
  • @casablanca 他没有,否则会在B和C上调用重载的方法,并以预期的类型调用visit。

标签: java polymorphism late-binding visitor-pattern


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多