覆盖方法时我的自定义代码应该在super(base)之前或之后

时间:2011-02-25 15:33:59

标签: c# java .net oop

当覆盖方法时,我的自定义代码应该在超级(基本)调用父类之前或之后?

6 个答案:

答案 0 :(得分:13)

这里有3种选择:

  • 如果您想在代码之前执行基本行为,请先调用它。
  • 如果您想在代码后执行基本行为,请在之后调用。
  • 如果您想完全覆盖基本行为,请不要完全调用它。

同样检查您的API文档非常重要。某些类具有不能通过代码强制执行的子类合同,但如果您不遵守其规则,则可能会破坏行为。在某些情况下,需要子类来调用超级实现。

答案 1 :(得分:2)

这取决于您希望代码执行的时间:基本方法之前或之后。

答案 2 :(得分:2)

这取决于你想在原始方法之前或之后制作一些东西。好的做法是在超级调用后编写自定义代码。那是因为你添加了一些新的代码。

答案 3 :(得分:1)

这取决于您想要的行为。你根本不需要调用super的方法。您调用它的位置取决于您是否希望在基类代码之前或之后执行代码。

答案 4 :(得分:0)

与大多数事情一样,简单的答案是:它取决于。

指定super或base允许您通过向基本实现中已存在的功能添加功能来“扩展”该方法。该代码可能需要在对基本功能的调用之前,之后或之后执行。这一切都归结为被覆盖的实现需要在基础实现之上和之外做的事情。

有些地方,至少在C#中,你无法选择。例如,C#中派生类的构造函数必须在其声明中定义一个基本构造函数(默认为无参数构造函数(如果存在))。基类的代码总是在派生类之前执行,你不能简单地在构造函数中调用base(x,y)

答案 5 :(得分:0)

子类实例变量与超类参数的相关性将决定代码的位置(Java):


private final Baz baz;

public SubClass(Foo foo, Bar bar) {
  Qux qux = QuxFactory.getQuxForFoo(foo);
  super(bar, qux);
  /* getSize() is a method defined on our super class */
  baz = BazFactory.getBazOfSize(getSize());
}