2014-01-30 102 views
1

我看過並沒有完全找到類似於我正在處理的內容。希望有一個解決方案,或提供更好的實施。我有一個可以傳遞一個可選參數的類,該參數被保存到創建的實例中。然後我有一個具有類似可選參數的派生類,但在其非參數構造函數中執行其他準備工作,而不考慮可選參數。讓它調用基類參數構造函數的正確方法是什麼,但仍然執行派生的非參數構造函數。調用base()和this()的構造函數

public class MyBaseClass 
{ 
    protected object preserveParm; 
    protected int someValue; 

    public MyBaseClass() 
    { 
     someValue = 1; 
    } 

    public MyBaseClass(object SomeParm) : this() 
    { 
     preserveParm = SomeParm; 
    } 
} 

public class DerivedClass : MyBaseClass 
{ 
    private int customSecondaryProp; 
    private DateTime when; 

    public DerivedClass() 
    { 
     customSecondaryProp = 10; 
     someValue = 5; 
    } 

    public DerivedClass(object SomeParm) : base(SomeParm) 
    { 
     when = DateTime.Now; 
    } 
} 

所以,如果我做了

DerivedClass test = new DerivedClass("testing"); 

我需要它擊中了基類來保存參數,但也打擊了派生類的非參數設置採樣虛假值。

現在,Derived參數方法被命中,然後命中基類的參數構造函數,該構造函數調用基類的「this()」,並將鏈返回到DerivedClass參數構造函數,完成自身,但從不碰到DerivedClass構造函數。有沒有辦法強制baseclass無參數和DerivedClass無參數構造函數?

+3

我通常有非參數的構造函數調用參數的構造函數有一個合適的值,而不是你周圍的道路」重新做。然後所有的邏輯結束於類參數最多的構造函數,它可以調用最合適的基類構造函數(如果需要,可以再次填入省略的參數以調用其最參數化的形式) –

+0

@ Damien_The_Unbeliever,從來沒有想過相反的事實,因爲實際的傳入對象比簡單的「對象」更復雜,但會研究它。謝謝。 – DRapp

+0

@nawfal,對於已經選擇瞭解決方案的問題,請不要試圖將意見反饋給重複項......在我看來,這只是浪費。 – DRapp

回答

3

看來你想要的東西,如:

public DerivedClass(object SomeParm) : base(SomeParm), this() 

但這是不可能在C#:see this answer for details 我建議你實現派生的構造函數初始化在方法中並在兩個構造函數中手動調用它:

​​

如果可能的話,你也可以使用以下語法進行初始化:

private int customSecondaryProp = 10; 
+0

heh來調用,這正是我剛剛回答的。你是第一個,所以+1,我刪除了我的答案。 :) – hvd

0

爲什麼不在這裏使用可選參數來強制類型只有一個構造函數。

public DerivedClass(object SomeParam = null) : base(SomeParam) { 
    customSecondaryProp = 10; 
    someValue = 5; 
    if (SomeParam != null) { 
    when = DateTime.Now; 
    } 
} 

public MyBaseClass(object SomeParam) { 
    someValue = 1; 
    preserveParam = SomeParam; 
} 
+0

因爲無論我想要設置其他參數的參數,類都不需要該參數。 – DRapp

+0

@DRapp這是可選參數給你的。它可以用'new DerivedClass()'或'DerivedClass(s​​omeObj)'' – JaredPar

0
public DerivedClass():base(null) 

您可以發送空的參數的構造函數

相關問題