Oop 在理想的OO设计中,继承对象是否应该对其每个方法隐式调用super()?

Oop 在理想的OO设计中,继承对象是否应该对其每个方法隐式调用super()?,oop,inheritance,methods,superclass,Oop,Inheritance,Methods,Superclass,也就是说,当调用child.update()时,派生类隐式的实例是否应该在调用之前调用其自身的所有超类的update()。有时我先说,有时我最后说。有时我会有条件地称之为“有条件的”,有时,我根本不称之为“有条件的” 很多时候(这来自C#背景),基类函数只是引发一个事件,子类重写该方法以获得类似事件的功能。在某些情况下,孩子不希望引发该事件: class Base { public event EventHandler UnhandledError; protected virtua

也就是说,当调用child.update()时,派生类隐式的实例是否应该在调用之前调用其自身的所有超类的update()。有时我先说,有时我最后说。有时我会有条件地称之为“有条件的”,有时,我根本不称之为“有条件的”

很多时候(这来自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);
   }
}

否。可能有人需要覆盖update(),并希望完全阻止来自父级的任何调用。在这种情况下,隐式调用不仅会影响性能,而且可能会做一些您不想做的事情。

您不是将一个类包装到另一个类,而是从一个超类继承

重写超类方法只有当您需要扩展父类的行为时,才应该调用
super.method()
,没有好的答案(用我所知道的语言)。有时您希望替换超级方法。有时你想在它执行之前插入一些东西,有时在它执行之后。扩展类似乎需要知道更多关于它所覆盖的类的细节,而不是它应该知道的。(这在封闭源代码系统中会变得很尴尬。)此外,基类有时真的想要控制调用类的行为,以强制调用超级方法,这也是不对的。我认为最好的办法是让超类尽可能地记录其可重写的方法,这样重写的程序员就可以猜到该做什么

我最接近于正确地处理这个问题的方法是使目标方法不能被重写,然后让它调用一个或多个方法,这些方法除了可以被重写之外什么都不做。然后重写类可以重写它感兴趣的任何方法,而不会破坏超类


对于这个问题,终极编程语言将有一个简单的解决方案。

如果它是真正的OOP,那么超类方法很重要,应该在它们修改变量或调用其他函数/方法时运行。除非您公开重写该方法,否则不,您希望替换它。这取决于:子类是否需要父类的功能?如果是,那么是。如果不是,那当然不是!子类可以自由地完全重新定义父类的功能。dlev:那么它应该隐式调用父类的功能并提供阻止该行为的方法,还是不调用任何东西并提供阻止该行为的方法?TheZ:我将编辑该问题,并在此基础上添加一个问题。@Dokkat就像我说的,这实际上取决于您希望代码做什么。您想要父功能吗?如果是这样,您希望它发生在您自己的代码之前还是之后?应该一直执行吗?回答这些问题,然后你原来的问题会自己回答。