2011-01-31 50 views
6

似乎沒有用於指定this()和base()構造函數的語言語法。給定以下代碼:C#中的this()和base()構造函數

public class Bar : Foo 
{ 
    public Bar() 
     :base(1) 
     //:this(0) 
    { } 
    public Bar(int schmalue) 
     :Foo(1) 
    { 
     //Gobs of initialization code 
     ... 
     Schmalue = schmalue; 
    } 

    public int Schmalue { get; private set; } 
} 

public class Foo 
{ 
    public Foo() 
    { 
     Value = 0; 
    } 

    public class Foo(int value) 
    { 
     Value = value; 
    } 

    public int Value { get; private set; } 
} 

編譯器給了我一個錯誤,指出取消註釋this(0)時需要注意'{'。這很麻煩,因爲這會導致我將我的代碼分解爲私有方法,當這種功能被明確提供以防止出現這種情況時。

我只是做了這個錯誤?我試過沒有分隔符,分號,逗號......似乎這只是開發團隊的疏忽而已。我感興趣的是爲什麼這個被省略,如果我以錯誤的方式去解決這個問題,或者如果有人對替代方案有很好的建議。

+1

[在C#中調用Overriden構造函數和基構造函數]可能的副本(http://stackoverflow.com/questions/335286/calling-overriden-constructor-and-base-constructor-in-c) – Oded 2011-01-31 19:16:58

+2

謝謝大家的答案。本質上,問題是this()也可能調用另一個基構造器。 – Sprague 2011-01-31 19:35:49

回答

8

您可以在您的鏈的末端調用基類的構造實現這一點:

public Bar(): this(0) {} 
public Bar(int schmalue): base(1) { 
    // ... initialize 
} 
3

不,您只能鏈接到一個構造函數 - 在同一個類中的另一個構造函數或基礎構造函數。

這是不是很清楚你想要做什麼。通常我發現在派生類中創建一個「主要」構造函數是值得的:派生類中的所有其他構造函數都使用「this」來調用主函數,它調用「base」來調用適當的基構造函數。

雖然這種模式不適合場景 - 特別是當你想從不同來源的構造函數調用不同的基礎構造 - 它是通常一個很好的模式。

1

在您的設計中,我看不到BarFoo類之間的許多常見事物。爲什麼FooBar派生?當你重新實現一切時?這兩個類都有一個帶有公共getter和private setter的整數屬性,並且這兩個類都有默認的構造函數和一個允許初始化整數屬性的構造函數。那麼爲什麼這兩個類都存在呢?

0

在酒吧的第二個構造函數是完全錯誤的。嘗試:

public Bar(int schmalue) 
    :base(1) //would call Foo(1) 
{ 
    //Gobs of initialization code 
    ... 
    Schmalue = schmalue; 
} 

在第一構造函數的評論似乎意味着像與schmalue

  • 初始化酒吧= 0

  • 調用基構造函數美孚與值= 1

對不對?

爲了做到這一點,更換第二構造函數,只需添加一個(私人)構造函數,可以同時處理值

public Bar(int schmalue) 
    :this(1, schmalue) //would call Bar(1, schmalue) 
{ 
} 

private Bar(int value, int schmalue) 
:base(value) 
{ 
    //Gobs of initialization code 
    ... 
    Schmalue = schmalue; 
} 
3

考慮,如果你可以打電話給兩個thisbase的構造函數在一個構造函數中會發生什麼。我們假設首先調用基礎構造函數。然後,將調用構造函數this - 它本身將調用基礎構造函數。因此,基類將被實例化兩次。這打破了構造函數的語義 - 即一個對象被構造一次。

因此,撥打basethis是禁止的。如果需要,讓您的委託構造函數調用具有特定參數的基礎。