2016-03-04 64 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() { }