2013-05-27 71 views
8

比方說,我有Foo以下構造函數在C#:有條件地構造函數,C#

public Foo() 
{ 
    // ... 
} 
protected Foo(bool connect) 
    : this() 
{ 
    // ... 
} 

我正在尋找一種方式來每當connect參數true只執行this()部分。這是一種方法來做到這一點? (對於好奇的人來說:背後的原因是Foo類創建了連接到某些事物的對象;當它們被創建時,它們也應該總是嘗試連接,現在我正在創建一個模擬器(或MOCK)爲它擴展了Foo類,這就是我爲protected構造函數添加的;當使用這個時,應該有選項不創建實際的連接,我想在實現這個時將Foo類改爲儘可能少。)

回答

7

不,你不能以這種方式撥打this()條件。但是,您可以在條件代碼移到protected構造器並調用從public一個構造函數:

public Foo() : this(true) 
{ 

} 

protected Foo(bool connect) 
{ 
    if(connect) //... 
} 
+2

我個人比較喜歡這種方法。它避免了調用一個非構造函數方法的缺點,即只讀字段不能在非構造函數中初始化。它也擴展到許多構造函數(所有這些都可以調用受保護的甚至私有的「主」構造函數) - 儘管調用init()方法也可以調整比例。 –

+0

是的,其實我認爲這也是最好的方式 –

+0

考慮@MatthewWatson所說的,這確實可能是正確的答案。謝謝! –

6

一種方法就是創建一個init()函數:

public Foo() 
{ 
    // ... 
    init(); 
} 
protected Foo(bool connect) 
{ 
    // ... 
    if (connect) { 
     init(); 
    } 
} 
+0

我想這是做它確實是最好的方式。 'init()'是私有的,這個類不會有明顯的改變,這正是我所需要的。 –

2

不能稱之爲()有條件的,所以你必須使用一個方法,而不是

public Foo() 
{ 
    ConnectCode(); 
} 
protected Foo(bool connect) 
    : this() 
{ 
    if(connect) 
     ConnectCode(); 
} 

另一種方式(不知道它的好,或者如果它是確定您的需求)是:

public Foo(bool connect=true) 
{ 
    if(connect) 
     ConnectCode(); 
} 

這樣調用美孚()的代碼並不需要改變,但你失去了保護可訪問