2011-02-26 11 views
6

Say mam następujące:Konstruktor łańcuchowym w związku z wywołaniem konstruktora baza

class Base { 
    public Base (int n) { } 
    public Base (Object1 n, Object2 m) { } 
} 

class Derived : Base { 

    string S; 

    public Derived (string s, int n) : base(n) { 
     S = s; 
    } 

    public Derived (string s, Object1 n, Object2 m) : base(n, m) { 
     S = s; // repeated 
    } 
} 

Wskazówki jak muszę formalny argument n w obu przeciążeń pochodny, a więc muszę powtórzyć linię N = n;.

Teraz wiem, że można to zamknąć w osobnej metodzie, ale nadal potrzebujesz tych samych dwóch wywołań metod z obu przeciążenia. Czy istnieje bardziej "elegancki" sposób robienia tego, być może przy użyciu this w połączeniu z base?

Jest tak, że mogę mieć prywatnego konstruktora, który bierze jeden argument s, a pozostałe dwa przeciążenia mogą wywołać ten ... czy może to jest to samo, co oddzielna metoda prywatna?

+1

Co w tym złego właśnie wywołanie innego przeciążenie konstruktora z konstruktora, który akceptuje dodatkowy parametr? 'this (s, n)' zamiast 'base (n, m)' –

+0

Zmodyfikowałem pytanie tak, aby lepiej odzwierciedlało to, co obecnie mam. Zmieniłem typy argumentów przeciążonego podstawowego konstruktora. –

+0

Ach, bardzo dobrze. Nie pisałem tego jako odpowiedź początkowo, ponieważ uznałem, że brakuje mi czegoś oczywistego. Okazuje się, że tak właśnie było. –

Odpowiedz

5

Nie ma idealne rozwiązanie dla tego. Jest na to sposób, aby uniknąć powtarzania kodu w Derived konstruktorów, ale potem trzeba powtórzyć domyślną wartość parametru m:

public Derived (string s, int n) : this(s, n, 0) {} 
+0

Zmodyfikowałem pytanie tak, aby lepiej odzwierciedlało to, co obecnie mam. Zmieniłem typy argumentów przeciążonego podstawowego konstruktora. –

+0

@Andreas Grech: W takim przypadku nie możesz nawet zrobić tego, co sugerowałem. Nie da się uniknąć powtórzenia tego kodu. – Guffa

0

Tylko niewielka poprawa, ale ...

class Derived : Base 
{ 
    string S; 
    public Derived(string s, int n) : this(s,n,-1) 
    { 
    } 

    public Derived(string s, int n, int m) : base(n, m) 
    { 
     S = s; 
     // repeated  
    } 
} 
+0

Ah nie, to nie będzie go kroić; a poza tym to wygląda na dość brzydkie obejście, nie wspominając już o tym, że -1 może być poprawną wartością w 3-argumentowym przeciążeniu –

Powiązane problemy