动态转换为子类以使用正确的方法重载

时间:2014-02-19 17:46:59

标签: java inheritance polymorphism

我正在尝试让我的代码更具多态性。现在我有一个有四个不同子类的超类。我有一个接受超类作为类型的方法。我想在将其路由到另一个方法来处理其他操作之前执行一些通用操作。这就是我想象的:

public void performSomething(Super object) { 
    //do some generic action each time to object
    object.setSuperProperty();

    //now route to appropriate method to perform specific action
    doSpecific(object);
}

private void doSpecific(SubA object) { }

private void doSpecific(SubB object) { }

private void doSpecific(SubC object) { }

private void doSpecific(SubD object) { }

这样,如果我想添加更多功能 - 通过创建一个新的子类或其他 - 那么我只需要添加另一个具有正确子类类型的方法。但是,这是不可能的,因为编译器抱怨没有doSpecific(Super object)方法。相反,在performSomething(Super object)我必须做一个丑陋的事情:

if(object instanceof SubA)
    doSpecific((SubA)object);
else if(object instanceof SubB)
    doSpecific((SubB)object);
...

除了必须执行所有instanceof检查之外,还有更好的方法吗?有没有我想到的设计模式?我知道我将失去编译时类型检查安全性,但只是好奇其他解决方案可能存在的内容。

编辑:忘了提这个。 performSomethingdoSpecific是我称之为ClassA的无关课程的一部分。我考虑在Super类中创建一个抽象方法,以便子类可以正确地实现它。问题是performSomethingdoSpecific依赖于ClassA的大约8个不同成员。因此,如果我想将方法​​委托给子类,则需要大量参数,例如subB.doSpecific(int, int, String, String, Object, int, long, blah, blah);,我不确定它比原始instanceOf检查更好。这也会在ClassA和我所拥有的Super/Sub类之间产生紧密耦合,这似乎不对,因为我只需要从它们读取值。

1 个答案:

答案 0 :(得分:2)

我推荐Command Pattern

这意味着:您的每个子类都实现了doSpecific()方法。然后你的初始方法如下:

public void performSomething(Super object) { 
    //do some generic action each time to object
    object.setSuperProperty();

    //now route to appropriate method to perform specific action
    object.doSpecific(...);
}

编译器自动选择子类的方法 - 没有instanceOf检查你。