2012-04-05 113 views
2

我有一个叫Base类,它有一个名为​​方法。大约有100个类从这个基类派生,并提供他们自己的​​的实现。现在,我有一些我想要在Base.SomeMethod()中输入的常用逻辑。该方法需要在​​的末尾调用。我的问题是否可以在不更改每个派生类的​​方法的情况下调用此方法?如何调用基类方法不改变所有派生类

回答

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

    protected abstract void doExecute(); 

    public void someMethod() { 
    } 
} 

此解决方案可防止super code smell

+0

我必须将所有派生类从执行更改为doExecute正确吗? – Asha 2012-04-05 18:38:01

+0

@Asha是的,但大多数IDEs会让所有的方法一次改变,所以它不应该是一个大问题。 – Jeffrey 2012-04-05 18:39:53

2

是的,但你必须改变呼叫者。调用者必须调用doExecute()(尽管找到一个更好的名字)方法,您在基类中将其定义为final,并调用​​,然后调用通用代码。

另一种选择是面向方面的编程,但我不会推荐它用于此目的,也就是要“破解”代码。

的问题是:为什么在100个左右的类别这样的问题改变方法的名字吗?这是使用IDE单击鼠标。

+0

是的,这很简单..但我不是每个从我的班级派生出来的人都记得调用这个方法。 – Asha 2012-04-05 18:30:59

+0

如果你已经在使用Spring或者类似于允许半非痛苦代理的东西,这并不是一个很糟糕的想法。但我同意;为了方便起见,我不会走这条路。咬住项目符号,并尽可能更改所有派生类。 – 2012-04-05 18:32:11

+0

他们不需要,因为它是相反的。看看@Jeffrey发布的代码,这就是我的意思。 – biziclop 2012-04-05 18:34:29

0

不是我所知道的。下一次你应该考虑你可能想为所有扩展类添加一些常见的操作,并且要求super.execute()

0

只能通过使用代表您的代码的东西;这对纯Java来说是不可能的。

0

让我说出你的问题,我的理解:动物类有有执行和因继承所有子类有这个会员呼吸()方法,除非有呼吸的人非常不同的方式将覆盖。

现在,在呼气的方法结束时,你要调用CloseEyes()动物类的方法,并且可以是部分或全部子类覆盖CloseEyes()方法,这是事实。

所以你的问题:每当你想他们CloseEyes但是从动物类,而不是从派生类的任何动物的气息。

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

  2. 如果你仍然只想调用基类的方法,那么为什么你需要相同的方法名称 - 你只是说AnimalEyeClose(),使其成为私人的,并在动物类中。

+0

我什么时候说我想用同名的方法? – Asha 2012-04-06 05:18:55

相关问题