【发布时间】:2014-02-20 03:02:42
【问题描述】:
我正在尝试使我的代码更具多态性。现在我有一个超类,它有四个不同的子类。我有一个接受超类作为类型的方法。我想在将其路由到其他方法以处理其他操作之前执行一些通用操作。这是我的设想:
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 检查更好的方法来做到这一点?有没有我没有想到的设计模式?我知道我会失去编译时类型检查的安全性,但只是好奇可能存在哪些其他解决方案。
编辑:忘了提这个。 performSomething 和 doSpecific 是我将调用 ClassA 的无关类的一部分。我考虑在 Super 类中创建一个抽象方法,以便子类可以正确实现它。问题是performSomething 和doSpecific 大约依赖于ClassA 的8 个不同成员。因此,如果我想将该方法委托给子类,则需要大量参数,例如subB.doSpecific(int, int, String, String, Object, int, long, blah, blah);,我不确定它是否比原来的instanceOf 检查更好。这也将在 ClassA 和我拥有的 Super/Sub 类之间创建紧密耦合,这看起来不正确,因为我只需要从中读取值。
【问题讨论】:
-
嗯,这只是在相关中弹出,这很有趣,但似乎紧密耦合,必须公开为公共方法才能调用:stackoverflow.com/questions/11924617/dynamic-cast-in-java?rq=1
-
performSomething和doSpecific在哪里? -
doCommon(Super s),代码重用和performSomething(SubA a),多态性呢?
标签: java inheritance polymorphism