2011-10-07 60 views
42

我通過刪除一些空的構造函數使我的構造函數更加嚴格一些。我很新的繼承,並與我得到的錯誤困惑:基類不包含無參數構造函數。我怎樣才能使A2從A繼承,而A中沒有空的構造函數。另外,爲了我個人的理解,爲什麼A2需要A的空構造函數?基類不包含無參數構造函數?

Class A{ 
    //No empty constructor for A 
    //Blah blah blah... 
} 

Class A2 : A{ 
    //The error appears here 
} 
+2

你不能沒有構造函數創建一個類的對象。如果你不想無參數的話,可以創建一個接受一些參數的構造函數。 –

+0

我應該在OP中更加清楚,A類和A2類都有帶參數的構造函數,我只是想刪除無參數的構造函數,以便創建一個類的實例,您需要該類的所有必要參數工作。這似乎是一件很直觀的事情,這是一個明智的做事方式嗎? – sooprise

回答

78

在A2類中,您需要確保所有構造函數都使用參數調用基類構造函數。

否則,編譯器將假定您想使用無參數基類構造函數來構造A2對象所基於的A對象。

例子:

class A 
{ 
    public A(int x, int y) 
    { 
     // do something 
    } 
} 

class A2 : A 
{ 
    public A2() : base(1, 5) 
    { 
     // do something 
    } 

    public A2(int x, int y) : base(x, y) 
    { 
     // do something 
    } 

    // This would not compile: 
    public A2(int x, int y) 
    { 
     // the compiler will look for a constructor A(), which doesn't exist 
    } 
} 
+2

我從來沒有見過這個,但這正是訣竅。非常感謝! – sooprise

+0

原來,如果您將其他構造函數設置爲使用帶基本構造函數的參數,則可以忽略無參數構造函數。 I.E. A2中的第二個定義是唯一需要的。 – Tyeth

+0

@Tyeth真的!但是如果基類中沒有無參數構造函數,每個構造函數都必須顯式調用基類構造函數。如果沒有指定基礎構造函數,編譯器將嘗試在基類中查找無參數構造函數。 –

2

如果你的基類沒有參數的構造函數,你需要使用base關鍵字來調用一個從你的派生類:

class A 
{ 
    public A(Foo bar) 
    { 
    } 
} 

class A2 : A 
{ 
    public A2() 
     : base(new Foo()) 
    { 
    } 
} 
8

例子:

class A2 : A 
{ 
    A2() : base(0) 
    { 
    } 
} 

class A 
{ 
    A(int something) 
    { 
     ... 
    } 
} 
+0

將基類放在第一位通常很容易閱讀。 –

+1

將基類放在不同的文件中更爲常見。 – Joe

1

致電一些構造函數。默認是撥打base()

您還可以在調用base()時將靜態方法,文字和任何參數用於當前構造函數。

public static class MyStaticClass 
    { 
     public static int DoIntWork(string i) 
     { 
      //for example only 
      return 0; 
     } 
    } 

    public class A 
    { 
     public A(int i) 
     { 
     } 
    } 

    public class B : A 
    { 
     public B(string x) : base(MyStaticClass.DoIntWork(x)) 
     { 
     } 
    } 
0

您您的基類構造函數會自動調用。因此,當您創建派生類對象時,並且派生類對象沒有帶一個或多個參數的構造函數時,將不會傳遞給需要一個論據。 所以要做到這一點,你需要的東西傳遞給基類構造函數如下:

Class A{ 
    //No empty constructor for A 
    //Blah blah blah... 
} 

Class A2 : A{ 
    public A2():base(some parameter) 
} 
相關問題