2016-03-04 41 views
-1

我有這樣的代碼:爲什麼不會這樣子類實例化

class Parent 
{ 
    public Parent(string someArg) 
    { 
     Console.WriteLine("Parent"); 
    } 

} 

class Child : Parent 
{ 
    public Child(string someArg) 
    { 
     Console.WriteLine("Child"); 
    } 
} 

我然後實例:

var child = new Child("something"); 

得到我的錯誤。我知道它與父構造函數有關,但我不確定爲什麼會出現這種情況。每次我在父類中都有一個非參數較少的構造函數時,我是否需要使用base?爲什麼?

+0

請註明返回什麼錯誤。 –

+1

將其更改爲'public Child(string someArg):base(someArg)'來調用父類的構造函數。 – juharr

+0

[C# - 使所有派生類調用基類構造函數]可能的重複(http://stackoverflow.com/questions/4296888/c-sharp-making-all-derived-classes-call-the-base-class-構造函數) – kayess

回答

5

基類也需要初始化。因此,當基類只有一個對參數有興趣的構造函數時,你必須提供它。在這種情況下,如果您重寫基類構造函數所做的所有操作,則可以讓基類具有第二個無參數構造函數。如果您想使用基類構造函數中的邏輯,您實際上別無選擇,只能撥打: base(string)

0

將此添加到基類以解決您的問題。

public Parent() {} 

或使其保護在聲明它有一個默認的無參數構造函數的類,只是使用它的子類

protected Parent() {} 
0

。如果你定義了你自己的結構,那麼默認的是不見了。在你的情況下,你用一個參數定義了一個構造函數。

當您創建一個新的實例時,應構造繼承層次結構中的每個類。基類只有一個帶有字符串參數的構造函數,它不會在代碼中調用。隱含的無參數構造函數調用也不會發生。

所以這就是爲什麼你應該白:

public Child(string someArg) :base(someArg) { } 

或者你可以把參數的構造函數早在你的代碼,並且不使用base

public Parent() { } 
相關問題