2

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

4

5 回答 5

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

    protected abstract void doExecute();

    public void someMethod() {
    }
}

此解决方案可防止超级代码异味

于 2012-04-05T18:28:06.547 回答
2

是的,但是您必须更改呼叫者。调用者将不得不调用一个doExecute()(尽管为它找到一个更好的名称)方法,您在基类中将其定义为 final,execute()然后调用公共代码。

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

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

于 2012-04-05T18:27:43.697 回答
0

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

于 2012-04-05T18:27:45.023 回答
0

只能通过使用可以检测您的代码的东西;这对于纯 Java 是不可能的。

于 2012-04-05T18:28:06.517 回答
0

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

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

所以你的问题:每次你想让他们关闭眼睛的任何动物呼吸,但来自动物类而不是派生类。

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

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

于 2012-04-06T03:17:31.163 回答