覆盖基本调用顺序约定?

时间:2012-04-18 03:49:57

标签: .net

我见过很多框架和辅助类,要求你在继承的类覆盖中调用base.MethodName()一些MethodName()。但是,其中一些要求它是覆盖方法中的最后一个调用,而其他人则要求它是第一次调用。它应该被调用的方式并不总是很明显,通常只能通过阅读文档或样本来计算出来。

那么,我是否正确的结论是,在该领域没有一些最佳实践,并且在覆盖方法中调用方法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
}

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

1 个答案:

答案 0 :(得分:4)

您需要调用基本方法的确切位置和顺序完全取决于基类的逻辑(它是如何设计的)。因此,没有“单向”总是正确的。您必须继续阅读规范和文档

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