我有这段代码:
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 :(得分:5)
基类也需要初始化。因此,当基类只有一个对参数有胃口的构造函数时,你必须提供它。
在这种情况下,如果要覆盖基类构造函数所做的所有事情,则可以让基类具有第二个无参数构造函数。如果你想在基类构造函数中使用逻辑,你真的别无选择,只能调用: base(string)
答案 1 :(得分:0)
在基类添加此项以解决您的问题。
public Parent() {}
或保护它仅用于子类
protected Parent() {}
答案 2 :(得分:0)
当你声明一个类时,它有一个默认的无参数构造函数。如果您定义自己的构造,则默认构造消失。在您的情况下,您定义了一个带参数的构造函数。
创建新实例时,应构建继承层次结构中的每个类。基类具有唯一的构造函数,该构造函数具有不在代码中调用的字符串参数。隐式无参数构造函数调用也不会发生。
这就是为什么你应该白:
public Child(string someArg) :base(someArg) { }
或者您可以将无参数构造函数放回代码中,不要使用base
:
public Parent() { }