重写基调用顺序约定



我见过许多框架和辅助类,它们要求您在继承的类中调用它们的base.MethodName()覆盖某些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
}

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

您需要调用基方法的确切位置和顺序完全取决于基类的逻辑(它是如何工作的)。 因此,没有"一种方法"总是正确的。 您将不得不继续阅读规格和文档

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

最新更新