2013-05-27 17 views
8

Powiedzmy mam następujące konstruktory dla Foo w C#:Warunkowo wywołanie konstruktora w C#

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

szukam sposobu, aby tylko wykonać this() część gdy parametr connect jest true. Czy jest to sposób na zrobienie tego?

(Dla ciekawskich: powodem jest to, że klasa Foo tworzy obiekty, które łączą się z określonymi rzeczami, a kiedy są tworzone, powinny również zawsze próbować się łączyć, a teraz tworzę emulator (lub MOCK) dla tego, co rozszerza klasę Foo.Do tego dodam konstruktora protected dla, gdy ten jest używany, powinna istnieć opcja, aby nie utworzyć rzeczywistego połączenia. Chcę to zaimplementować przy zmianie klasy Foo jako . trochę jak to możliwe)

Odpowiedz

7

nie, nie można nazwać this() warunkowo w ten sposób. Można jednak przenieść kod warunkowy do protected contructor i po prostu zadzwonić, że konstruktor z jednym public:

public Foo() : this(true) 
{ 

} 

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

Ja osobiście faworyzuję to podejście. Pozwala to uniknąć wady wywoływania metody innej niż konstruktor, która polega na tym, że pola 'readonly' nie mogą być inicjowane w nie-konstruktorze. Skaluje się również do wielu konstruktorów (z których każdy może wywołać konstruktor chroniony lub nawet prywatny "master") - chociaż wywołanie metody init() również się skaluje. –

+0

Tak, właściwie myślę, że to też najlepszy sposób. –

+0

Biorąc pod uwagę to, co powiedział @MatthewWatson, jest to prawdopodobnie poprawna odpowiedź. Dzięki! –

6

Jednym ze sposobów, aby to zrobić, jest stworzenie init() funkcję:

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

myślę, że to jest najlepszy sposób, aby to zrobić naprawdę. Ponieważ 'init()' jest prywatne, klasa nie będzie widocznie zmieniona, co jest dokładnie tym, czego potrzebowałem. –

2

Nie można nazwać() warunkowo więc trzeba użyć metody zamiast

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

Innym sposobem (nie wiem, czy to dobrze, czy to jest w porządku dla swoich potrzeb) jest:

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

ten sposób kod, który nazywamy Foo() nie muszą być zmienione, ale tracisz zabezpieczony dostęp

Powiązane problemy