繁体   English   中英

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

[英]How to call a base class method without changing all derived classes

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

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

    protected abstract void doExecute();

    public void someMethod() {
    }
}

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

是的,但是你必须改变来电者。 调用者将不得不调用doExecute() (尽管为它找到更好的名称)方法,您在基 class 中将其定义为最终方法,并调用execute() ,然后是公共代码。

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

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

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

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

让我 state 你的问题,据我所知:动物 class 有 Breath() 方法,它有实现并且由于 inheritance 所有子类都有这个成员,除非有非常不同的呼吸方式,否则没有人会覆盖。

现在,在 Breath 方法的末尾,您想调用动物 class 的 CloseEyes() 方法,并且某些或所有子类覆盖 CloseEyes() 方法可能是正确的。

所以你的问题:每次你想让它们呼吸到 CloseEyes 但来自 Animal class 而不是来自派生类。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM