也就是说,当调用 child.update() 时,派生类的实例是否应该先隐式调用其所有超类的 update() ?
问问题
89 次
4 回答
0
您不是将一个类包装到另一个类中,而是从超类继承。
super.method()
仅在需要扩展 parent 的行为时才应调用覆盖超类方法method()
。
于 2012-06-21T09:32:05.110 回答
0
没有好的答案(用我知道的语言)。有时你想替换 super 方法。有时你想在它执行之前加入一些东西,有时在. 看起来扩展类需要比它应该知道的更多地了解它所覆盖的类的细节。(这对于闭源系统来说很尴尬。)此外,基类有时确实想控制调用类的行为,以强制调用超级方法,这也是不对的。我认为最好的办法是让超类尽可能地记录其可覆盖的方法,以便覆盖的程序员可以猜测要做什么。
我最接近正确和正确地处理这个问题是使目标方法不能被覆盖,然后让它调用一个或多个除了可以被覆盖之外什么都不做的方法。然后覆盖类可以覆盖它感兴趣的任何方法,而不会破坏超类。
最终的编程语言将对这个问题有一个万无一失的解决方案。
于 2012-06-21T19:24:32.323 回答
0
这实际上取决于超类/基类函数的作用。有时我先调用它,有时我最后调用它。有时我有条件地调用它,有时我根本不调用它。
很多时候(这来自 C# 背景),基类函数只是引发一个事件,而子类重写该方法以获得类似事件的功能。在某些情况下,孩子不希望引发该事件:
class Base {
public event EventHandler UnhandledError;
protected virtual void OnUnhandledError(Error error) {
if (UnhandledError != null)
UnhandledError(this, EventArgs.Empty);
}
}
class Derived : Base {
protected override void OnUnhandledError(Error error) {
if (HandleError(error))
return; // We took care of it. Don't raise the event.
// We couldn't handle it. Let the base class raise the event.
base.OnUnhandledError(error);
}
}
于 2012-06-20T23:19:13.720 回答
0
不,有人可能需要重写 update() 并希望完全阻止来自父母的任何呼叫。在那种情况下,隐式调用不仅会损害性能,还可能会做你不想做的事情。
于 2012-06-20T23:20:42.810 回答