2009-08-26 11 views
2

基本コンストラクタを呼び出す前に、最初に派生クラスコンストラクタを呼び出す必要があるクラスがあります。私は、次のコードで、基本コンストラクタが最初に呼び出されることを知っています:コンストラクタを継承することによるコンストラクタ呼び出しの逆順

public class A { 

    protected A() { 
     //do something 
    } 

} 

public class B : A { 

    public B() : base() { 
     //do something else 
    } 

} 

その順序を逆にする方法はありますか? doConstructor()のような基本クラスに保護メソッドを追加作成し、最初のタスクの後に派生コンストラクタでそれを呼び出す可能性のある解決策の1つは、コンパイラがそれを受け付けないため、読み取り専用フィールドでは不可能です。

答えて

3

これを達成する直接的な方法はありません。過去に私はこの状況にも遭遇し、その回避策としてInitializeメソッドを使用しました。

public class A 
{ 
    protected A() 
    { 
     // Do pre-initialization here still. 

     Initialize(); 
    } 

    protected virtual Initialize() 
    { 
     // Do all post-derived-class initialization here. 
    } 
} 

public class B : A 
{ 
    public B() 
     : base() 
    { 
    } 

    protected override Initialize() 
    { 
     // Do initialization between pre- and post- initialization here. 

     base.Initialize(); 
    } 
} 

限り、あなたは前、後、ここで通常の初期化のガイドラインに従うよう、それが合理的に安全で良い習慣の中にある可能性があります。

+0

テンプレートメソッドパターン – abhilash

+0

私の画面からコードを読み込んでいるようです; o)コンストラクタからの仮想メンバーの呼び出しは通常は勧められますが、注意してください。 –

+0

ベースコンストラクタ( 'A')で仮想メソッドを呼び出すのは少し危険です。 'B'のオーバーライドは** B **のコンストラクタの前に実行されています。これは初期化されていないフィールドに問題を引き起こす可能性があります。私は一般的にここで注意するか、またはより良い:** post ** - ctor 'Initialize'ステップ。 –

関連する問題