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

tre*_*r-e 5 java polymorphism inheritance

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

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) { }
Run Code Online (Sandbox Code Playgroud)

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

if(object instanceof SubA)
    doSpecific((SubA)object);
else if(object instanceof SubB)
    doSpecific((SubB)object);
...
Run Code Online (Sandbox Code Playgroud)

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

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

exc*_*on1 2

我推荐命令模式

这意味着:每个子类都实现一个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(...);
}
Run Code Online (Sandbox Code Playgroud)

编译器自动选择子类的方法 - 无需instanceOf检查。