我有一个叫Base
类,它有一个名为方法。大约有100个类从这个基类派生,并提供他们自己的的实现。现在,我有一些我想要在Base.SomeMethod()
中输入的常用逻辑。该方法需要在的末尾调用。我的问题是否可以在不更改每个派生类的方法的情况下调用此方法?如何调用基类方法不改变所有派生类
回答
public class Base {
public final void execute() {
doExecute();
someMethod();
}
protected abstract void doExecute();
public void someMethod() {
}
}
此解决方案可防止super code smell。
是的,但你必须改变呼叫者。调用者必须调用doExecute()
(尽管找到一个更好的名字)方法,您在基类中将其定义为final,并调用,然后调用通用代码。
另一种选择是面向方面的编程,但我不会推荐它用于此目的,也就是要“破解”代码。
的问题是:为什么在100个左右的类别这样的问题改变方法的名字吗?这是使用IDE单击鼠标。
不是我所知道的。下一次你应该考虑你可能想为所有扩展类添加一些常见的操作,并且要求super.execute()
!
只能通过使用代表您的代码的东西;这对纯Java来说是不可能的。
让我说出你的问题,我的理解:动物类有有执行和因继承所有子类有这个会员呼吸()方法,除非有呼吸的人非常不同的方式将覆盖。
现在,在呼气的方法结束时,你要调用CloseEyes()动物类的方法,并且可以是部分或全部子类覆盖CloseEyes()方法,这是事实。
所以你的问题:每当你想他们CloseEyes但是从动物类,而不是从派生类的任何动物的气息。
如果已经有CloseEyes()在许多派生类中的方法,那么你实际上是做一些错误调用基类的CloseEyes()。
如果你仍然只想调用基类的方法,那么为什么你需要相同的方法名称 - 你只是说AnimalEyeClose(),使其成为私人的,并在动物类中。
我什么时候说我想用同名的方法? – Asha 2012-04-06 05:18:55
- 1. 如何从C++派生类调用基类方法?
- 2. C++如何从多个派生类调用基类方法?
- 3. 如何调用被覆盖的方法,所有派生类
- 4. 派生类没有调用基类的方法
- 5. 从静态基类方法调用静态派生类方法
- 6. 如何调用通过基类指针基类方法指向派生类
- 7. 如何修改所有派生类中的方法返回值?
- 8. 无法从派生类中调用基类方法
- 9. C# - 使所有派生类调用基类构造函数
- 10. 派生的方法在基类不叫
- 11. 从派生类中调用C#基类扩展方法?
- 12. 从基类参考调用派生类的方法
- 13. 通过基类的ptr调用派生类的方法
- 14. 调用重写的方法在派生类的基类
- 15. 从派生类对象调用基类方法
- 16. 如果派生类重写方法,为什么调用基类方法?
- 17. 在C#中如何调用派生类实例中已在派生类中重写的基类方法
- 18. 使用在基类派生类,而派生类的基类
- 19. 使用基类的通用方法指针来调用派生类的方法
- 20. 在派生类的方法中使用基类的方法
- 21. 所有派生类都使用的基类方法除了一个
- 22. 派生类调用父的方法
- 23. C++派生类方法调用
- 24. 通过派生类虚拟方法调用基类虚拟方法
- 25. CRTP:基于派生类内容在基类中启用方法
- 26. 如何从基类静态方法访问派生类的值?
- 27. 列出派生类中的所有方法/变量
- 28. 如何:派生类中派生类的派生类与特定于派生类的方法
- 29. 如何从派生自不同基类的类的构造函数中调用不同的派生类
- 30. 哪个基类调用派生重写方法?
我必须将所有派生类从执行更改为doExecute正确吗? – Asha 2012-04-05 18:38:01
@Asha是的,但大多数IDEs会让所有的方法一次改变,所以它不应该是一个大问题。 – Jeffrey 2012-04-05 18:39:53