我见过很多框架和辅助类,要求你在继承的类覆盖中调用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
}
用户失去了一些灵活性(可以理解为“有更少的选项可以打破,或者让你的框架工作错误”)但是使用很简单。
答案 0 :(得分:4)
您需要调用基本方法的确切位置和顺序完全取决于基类的逻辑(它是如何设计的)。因此,没有“单向”总是正确的。您必须继续阅读规范和文档
也许更好的设计是不需要任何回调基础:基础执行它认为合适的方法,并允许派生类通过基本在需要时调用的抽象方法提供自定义功能;从而使客户不必知道电话的确切顺序。