2011-02-11 111 views
21

這不會編譯:爲什麼基類有一個需要0個參數的構造函數?

namespace Constructor0Args 
{ 
    class Base 
    { 
     public Base(int x) 
     { 
     } 
    } 

    class Derived : Base 
    { 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
     } 
    } 
} 

相反,我得到以下錯誤:

'Constructor0Args.Base' does not contain a constructor that takes 0 arguments

這是爲什麼?基類有必要有一個帶0參數的構造函數嗎?

回答

28

不是 - 問題是,它需要調用一些基礎構造函數,以初始化基類型,並且默認將調用base()。您可以通過自己在派生類的構造函數指定特定的構造函數(及其參數)調整如下:

class Derived : Base 
{ 
    public Derived() : base(123) {} 
} 

對於參數base(或者,this)構造函數,你可以使用:

  • 參數的當前構造
  • 文字/常數
  • 靜態方法調用(也涉及以上)

例如,以下是有效,使用上面所有的三顆子彈:

class Derived : Base 
{ 
    public Derived(string s) : base(int.Parse(s, NumberStyles.Any)) {} 
} 
+0

啊..當然。現在有意義:) – mpen 2011-02-11 06:42:55

7

如果你不明確定義一個類的構造函數,一個默認的構造函數被自動定義,它看起來像這樣:

public Derived() : base() 
{ 
} 

您需要指定在基類的構造函數,以及作爲參數傳遞給它:

public Derived() : base(1) 
{ 
} 
13

當你得到從另一個類,基類將在派生類的構造函數之前被調用。當你沒有明確地調用構造函數時,你本質上是寫作的

由於Base類沒有0參數構造函數,因此這是無效的。

0

這是因爲當子類被實例化時,它也會實例化基類。默認情況下,它會嘗試找到一個arg less構造函數。這是這個代碼的工作:

class Base 
    { 
     public Base(int x) { } 
    } 
    class Derived : Base 
    { 
     public Derived(int x) 
      : base(x) 
     { 
     } 
    } 
相關問題