当变量是抽象父类时,Java调度到子类

时间:2015-08-06 15:49:53

标签: java types dispatch

我有一个抽象的父类Parent和六个子类ChildA虽然ChildF

另一个类Other有六个(静态)重载方法olmeth(),六个子类中的每一个都有一个。

我怎么写:

Parent message = Factory.returnRandomChildClass();
Other.olmeth(message);

目前我使用额外的方法,为父类重载,并进行六次instanceof检查以解决此问题。这是不可扩展的。

如何让Java在实际类型的message上发送,而不是在消息的引用的类型上发送?

2 个答案:

答案 0 :(得分:2)

Parent中创建一个抽象方法,让每个孩子调度到自己的static重载:

abstract class Parent {
    protected abstract void send();
}
class ChildA extends Parent {
    protected void send() {
        Other.olmeth(this);
    }
}
class ChildB extends Parent {
    protected void send() {
        Other.olmeth(this);
    }
}
...
class ChildF extends Parent {
    protected void send() {
        Other.olmeth(this);
    }
}

请注意,虽然send()的所有六个实现中的代码看起来完全相同,但这些方法实际上会调度到Other的六个不同重载,因为每个this的静态类型情况不同。

答案 1 :(得分:1)

使用double dispatch模式。为每个olmeth子类实施Parent逻辑,并将当前的olmeth方法更改为:

 static void olmeth(Parent p) {
     p.olemth();
 }