2013-06-14 10 views
5

Jest możliwe w C# do decydowania w konstruktorze, który inny nadpisać konstruktora użyć? Poniższy kod nie kompiluje się! Nie wiem, jakie użycie wywołania.Czy konstruktor może zawierać logikę, która określa, do których innych nadpisań konstruktora należy wywoływać?

public IntRange(int val, bool isMax) 
     : isMax ? this() : this() 
    { 
     if (isMax) 
     { 
      IntRange(0, val); 
     } 
     else 
     { 
      IntRange(val, int.MaxValue); 
     } 
    } 
+4

Nie, po prostu wyodrębnij wspólną logikę do prywatnych metod i wywołaj je w konstruktorze w zależności od wartości 'isMax'. – vcsjones

+3

Wydaje się, że lepiej byłoby podjąć tę decyzję przed wywołaniem _any_ konstruktora. – DonBoitnott

+3

Nie w języku C#. Myślę, że można to legalnie zrobić w IL. –

Odpowiedz

9

Jak o:

class IntRange { 
     public IntRange(int val, bool isMax) 
     : this(isMax ? 0 : val, isMax ? val : int.MaxValue) { 
     } 
     public IntRange(int min, int max) { 
     } 
    } 
+0

Prawdopodobnie sprawiłbym, że isMax byłby również parametrem domyślnym (false), jeśli nie będzie dużo używany lub po prostu ułatwi wywoływanie. –

2

Można osiągnąć coś takiego za pomocą metody statycznej na obiekt następująco

class IntRange { 

    public IntRange(int min, int max) { 
     // write code here 
    } 

    public static IntRange Construct(int val, bool isMax) { 
     if (isMax) { 
      return new IntRange(0, val); 
     } else { 
      return new IntRange(val, int.MaxValue); 
     } 
    } 
} 

Można nawet zrobić konstruktor public IntRange(int min, int max) prywatny, aby wymusić zastosowanie metody statycznej.

Uważam, że statyczne metody konstruowania takich obiektów są szczególnie przydatne, gdy można zamiast tego utworzyć podklasę.

+0

Metoda metody fabrycznej. Miły. Zasadniczo uczynię niestatyczny konstruktor prywatnym w tym scenariuszu, jak to zauważyłeś. –

0

To nie kompiluje ponieważ zestawienia isMax? this(): this() w konstruktorze po: można wywołać tylko konstruktor klasy podstawowej lub przeciążone konstruktory tej samej klasy.

Powiązane problemy