我有一个超类,有2个子类。如果条件foo为真,我希望其中一个子类采取一些动作,而其他子类什么都不做:
public void doFoo() {
// some 10 lines common to both subclasses.
boolean foo = checkFoo();
/**
* if foo is true, subclass1 should do something. subcass2 does nothing.
*/
// some 10 lines common to both subclasses.
}
我提出的解决方案:
public void doFoo() {
// some 10 lines common to both subclasses.
boolean foo = checkFoo();
if (foo) {
doSomething();
}
// some 10 lines common to both subclasses.
}
class subclass1 extends superclass {
public void doSomething() {
// some lines of code.
}
}
class subclass2 extends superclass {
public void doSomething() {
// do nothing
}
}
针对这个常见问题的任何更清洁,更好,更标准的解决方案?
答案 0 :(得分:6)
您所描述的内容有一个名称:它是Template Method pattern。设计模式现在并不像以前那样被大肆宣传,但模板方法模式仍然是一种经过验证的方法,可以解决您所描述的一般问题。
如果你想避免在子类中编写空的doSomething()
方法,那么一种方法就是在超类上放置一个空的doSomething()
方法。这可以服务多个子类(假设你有两个以上的整体担心),但就个人而言,我倾向于对此有点皱眉。覆盖非抽象方法应该是罕见的(充其量)异常,而不是常见的做法。
答案 1 :(得分:3)
这是“正确的”方法。但有些说明: