为什么基类必须有一个带0参数的构造函数?

mpe*_*pen 22 c# constructor class

这不会编译:

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

    class Derived : Base
    {
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

相反,我收到以下错误:

'Constructor0Args.Base'不包含带0参数的构造函数

这是为什么?基类是否需要一个带0参数的构造函数?

Mar*_*ell 29

不是 - 问题是它需要调用一些基础构造函数,以初始化基类型,默认是调用base().您可以通过在derived-types构造函数中自己指定特定的构造函数(和参数)来调整它:

class Derived : Base
{
    public Derived() : base(123) {}
}
Run Code Online (Sandbox Code Playgroud)

对于base(或替代this)构造函数的参数,您可以使用:

  • 当前构造函数的参数
  • 文字/常量
  • 静态方法调用(也涉及上述)

例如,以下内容也是有效的,使用上面的所有三个项目符号:

class Derived : Base
{
    public Derived(string s) : base(int.Parse(s, NumberStyles.Any)) {}
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以在基类型上添加无参数构造函数,并将其标记为受保护.这将允许派生类型使用默认构造函数,但您的类型的使用者无法使用它创建实例. (8认同)

Bra*_*don 13

从另一个派生类时,将在派生类构造函数之前调用基类.当您没有显式调用构造函数时,您实际上是在编写

class Derived : Base
{
    public Derived() : base()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

由于Base类没有0参数构造函数,因此无效.


Mar*_*ade 7

如果没有为类显式定义构造函数,则会自动定义默认构造函数,如下所示:

public Derived() : base() 
{
}
Run Code Online (Sandbox Code Playgroud)

您需要在基类上指定构造函数以及传递给它的参数:

public Derived() : base(1) 
{
}
Run Code Online (Sandbox Code Playgroud)