3

base.MethodName()継承されたクラスで some のオーバーライドを呼び出す必要がある多くのフレームワークとヘルパー クラスを見てきました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
}

ユーザーはある程度の柔軟性を失います (「壊れるオプションが少ない、またはフレームワークが正しく機能しない」と読むことができます) が、使用法は簡単です。

4

1 に答える 1

4

基本メソッドを呼び出す必要がある正確な場所と順序は、基本クラスのロジック (どのように動作するように設計されているか) に完全に依存します。したがって、常に正しい「一方通行」はありません。仕様とドキュメントを読み続ける必要があります

おそらく、より良い設計は、ベースへのコールバックを必要としないことです。ベースは、適切と思われるメソッドを実行し、必要に応じてベースが呼び出す抽象メソッドを介して派生クラスがカスタム機能を提供できるようにします。したがって、クライアントは呼び出しの正確な順序を知る必要がなくなります。

于 2012-04-18T03:55:26.837 に答える