如何在不更改所有派生类的情况下调用基类方法

时间:2012-04-05 18:24:28

标签: java oop

我有一个名为Base的类,它有一个名为execute()的方法。大约有100个类派生自这个基类,并提供自己的execute()实现。现在,我有一些我想要放在Base.SomeMethod()中的常见逻辑。需要在execute()结束时调用此方法。我的问题是,是否可以在不改变每个派生类的execute()方法的情况下调用它?

5 个答案:

答案 0 :(得分:7)

public class Base {
    public final void execute() {
        doExecute();
        someMethod();
    }

    protected abstract void doExecute();

    public void someMethod() {
    }
}

此解决方案会阻止super code smell

答案 1 :(得分:2)

是的,但您必须更改来电者。调用者必须调用doExecute()(尽管找到更好的名称)方法,您在基类中定义为final,并调用execute(),然后调用公共代码。

另一种选择是面向方面的编程,但我不建议将其用于此目的,即“破解”代码。

问题是:为什么在100个左右的类中更改方法的名称会出现这样的问题?只需用IDE点击鼠标即可。

答案 2 :(得分:0)

不是我知道的。下次你应该考虑为所有扩展类添加一些常用操作,并调用super.execute()

答案 3 :(得分:0)

只能使用能够检测代码的东西;纯Java无法做到这一点。

答案 4 :(得分:0)

让我按照我的理解陈述你的问题:Animal类有Breath()方法,它有实现,并且由于继承,所有子类都有这个成员,除非有非常不同的呼吸方式,否则任何人都会覆盖。

现在在Breath方法结束时,你想调用动物类的CloseEyes()方法,并且可能是某些或所有子类重写CloseEyes()方法。

所以你的问题:每次动物呼吸时,你想要它们来CloseEyes但是来自Animal类而不是派生类。

  1. 如果在许多派生类中已经存在CloseEyes()方法,那么在调用基类的CloseEyes()时实际上是做错了。

  2. 如果您仍然只想要调用基类的方法,那么为什么需要相同的方法名称 - 您只需要说AnimalEyeClose(),将其设为私有并将其保存在Animal类中。