2011-02-26 94 views
6

說我有以下幾點:構造結合鏈與底座構造函數調用

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 
    } 
} 

注意我是如何需要通過正規的參數n中的兩個重載的獲得,因此我必須重複N = n;線。

現在我知道這可以封裝到一個單獨的方法,但你仍然需要從兩個重載相同的兩個方法調用。那麼,有沒有更好的方法來做到這一點,或許可以使用thisbase

這是我可以有一個私人構造函數採取一個參數s和其他兩個重載可以調用那一個......或者這可能就像擁有一個單獨的私有方法一樣嗎?

+1

有什麼問題打電話是從接受額外的構造函數中的其他構造函數重載參數? 'this(s,n)'而不是'base(n,m)' – 2011-02-26 12:25:56

+0

我修改了這個問題,使它更好地反映了我目前的情況。我改變了重載基構造函數的參數類型。 – 2011-02-26 12:29:42

+0

啊,非常好。我最初並沒有將其作爲答案發布,因爲我認爲我錯過了一些明顯的東西。結果確實如此。 – 2011-02-26 12:30:56

回答

5

沒有爲沒有理想的解決方案。有一種方法,以避免重複在Derived構造方法的代碼,但你必須重複m參數的默認值:

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

我修改了這個問題,以便它能更好地反映我目前的情況。我改變了重載基構造函數的參數類型。 – 2011-02-26 12:41:04

+0

@Andreas Grech:在這種情況下,你甚至不能按照我的建議去做。沒有辦法避免重複該代碼。 – Guffa 2011-02-26 19:59:45

0

僅略有好轉,但...

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

啊不,不會削減它;此外,這看起來像一個非常醜陋的解決方法,更不用說-1這個事實可能是一個有效的值在3參數超載 – 2011-02-26 12:23:24