3

我见过许多框架和辅助类,它们要求您base.MethodName()在继承的类覆盖中调用它们 some MethodName()。但是,其中一些要求它是被覆盖方法中的最后一次调用,而另一些则要求它是第一次调用。应该以哪种方式调用它并不总是很明显,通常只能通过阅读文档或示例才能弄清楚。

那么,我的结论是否正确,在该领域没有一些最佳实践,并且base在覆盖方法中调用方法位置仅取决于框架设计器?或者有,我应该更喜欢某种设计而不是另一种?就我个人而言,我发现首先调用 base 更加自然,就像在构造函数中一样(强制执行此设计)。还是有一些情况(或领域)迫使开发人员使用特定的调用顺序?

更新。在@Attila 的帮助下,我现在可以看到,大多数base类调用都可以重新设计。而不是这个:

// FRAMEWORK
public virtual void SomeMethod()
{
  // framework code
}

// USAGE
public override void SomeMethod()
{
  base.SomeMethod();

  // user code
}

做这个:

// FRAMEWORK
public void SomeMethod()
{
  // framework code

  // you can place UserSomeMethod where you want, 
  // you can change it position in new versions of a fremework
  // without breaking user code
  this.SomeMethodUserCode();
}

protected abstract void SomeMethodUserCode();

// USAGE
protected override void SomeMethodUserCode()
{
  // user code
}

用户失去了一些灵活性(可以理解为“有更少的选项来破坏,或者让你的框架工作错误”),但使用起来很简单。

4

1 回答 1

4

您需要调用基方法的确切位置和顺序完全取决于基类的逻辑(它被设计为如何工作)。因此,没有永远正确的“一种方式”。您将不得不继续阅读规范和文档

也许更好的设计是不需要任何回调基类:基类执行它认为合适的方法,并允许派生类通过基类在需要时调用的抽象方法提供自定义功能;从而使客户不必知道调用的确切顺序。

于 2012-04-18T03:55:26.837 回答