2009-08-26 65 views
2

我有一個首先需要調用派生類的構造函數調用基構造函數之前類調用。我知道,通過下面的代碼基礎構造稱爲第一:反轉構造的順序通過繼承構造

public class A { 

    protected A() { 
     //do something 
    } 

} 

public class B : A { 

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

} 

是他們的一種方式扭轉這一秩序,或爲其解決方法?我們在doConstructor()等基類中創建額外的受保護方法並在第一個任務後在派生構造函數中調用它的可能解決方案不可能是隻讀字段,因爲編譯器不會接受它。

回答

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 2009-08-26 11:07:04

+0

看起來你正在閱讀的代碼了我的屏幕; O)我們應該知道,雖然從構造函數,調用虛擬成員通常防止建議。 – 2009-08-26 11:07:15

+0

在基礎構造函數('A')中調用虛擬方法有點危險; 'B'的覆蓋現在正在** ** B的構造函數之前運行,這可能會導致未初始化字段的問題。我通常會在此建議謹慎,或者更好:一個** post ** - ctor'Initialize'步驟。 – 2009-08-26 11:09:40