【问题标题】:Why is it necessary for a base class to have a constructor that takes 0 args?为什么基类必须有一个采用 0 args 的构造函数?
【发布时间】:2011-06-25 08:56:26
【问题描述】:

这不会编译:

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

    class Derived : Base
    {
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

相反,我收到以下错误:

'Constructor0Args.Base' 不包含采用 0 个参数的构造函数

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

【问题讨论】:

    标签: c# class constructor


    【解决方案1】:

    不是 - 问题是它需要调用 some 基本构造函数,以便初始化基本类型,并且 默认 em> 是打电话给base()。您可以通过在派生类型构造函数中自己指定特定的构造函数(和参数)来调整它:

    class Derived : Base
    {
        public Derived() : base(123) {}
    }
    

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

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

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

    class Derived : Base
    {
        public Derived(string s) : base(int.Parse(s, NumberStyles.Any)) {}
    }
    

    【讨论】:

    • 您还可以在基本类型上添加无参数构造函数并将其标记为受保护。这将允许派生类型使用默认构造函数,但您的类型的使用者无法使用它创建实例。
    • @Josh 这是一个有用的模式,尤其是对于接口之类的东西。
    【解决方案2】:

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

    class Derived : Base
    {
        public Derived() : base()
        {
        }
    }
    

    由于 Base 类没有参数为 0 的构造函数,因此这是无效的。

    【讨论】:

      【解决方案3】:

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

      public Derived() : base() 
      {
      }
      

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

      public Derived() : base(1) 
      {
      }
      

      【讨论】:

        【解决方案4】:

        这是因为当子类被实例化时,它也会实例化基类。默认情况下,它会尝试找到一个 arg 少的构造函数。这是使用此代码的工作:

        class Base
            {
                public Base(int x) { }
            }
            class Derived : Base
            {
                public Derived(int x)
                    : base(x)
                {
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2020-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-03
          • 1970-01-01
          相关资源
          最近更新 更多