2012-04-18 39 views
3

多くのフレームワークとヘルパークラスでは、継承されたクラスオーバーライドの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 
} 

ユーザーは、ある程度の柔軟性を失い(「壊れる、または間違ったあなたのフレームワークの仕事を作るために少数のオプションを持っている」と読むことができます)が、使い方は簡単です。

答えて

4

基本メソッドを呼び出す必要がある正確な場所と順序は、基本クラスのロジック(どのように設計されているか)によって決まります。したがって、常に正しい一方向はありません。

おそらく、より基本的な方法として、ベースはメソッドを実行しますが、deriverdクラスはそのメソッドを使ってカスタム機能を提供することができます。必要に応じてベースコール。クライアントがコールの正確な順序を知る必要がなくなります。

+0

基本的には基本的にすべてを呼び出さないと約束しました。必要なオーバーライドは抽象イモです。私たちは、requred 'base.'を持つフレームワークを呼び出して、悪いデザインを呼び出すことができますか?それは問題を解決する! :-) –

+0

私はそれが状況に依存すると思う:物事を行う特定の順序があるが、計算の一部をカスタマイズすることができる場合、抽象メソッドを呼び出す基本が最良の方法です。計算をある特定の方法で記述できない場合、一般的な、しかし固定の計算を実行するために派生した呼び出しベースがより良い方法です。 – Attila

関連する問題