关于C#中构造函数的几个问题

时间:2011-04-04 07:04:07

标签: c# .net inheritance constructor multiple-constructors

关于构造函数继承的C#:

  1. 我已经读过构造函数不能被继承。
  2. 如果基类包含一个或多个构造函数,派生类必须始终调用其中一个?派生类不可能跳过基类的构造函数吗?
  3. 派生类可以有自己的构造函数,但必须调用其中一个基类构造函数。
  4. 这些陈述是否更正?

3 个答案:

答案 0 :(得分:14)

  1. 是的,你是对的,构造函数不是继承的。因为Object具有无参数构造函数,这并不意味着String具有无参数构造函数。来自C#4规范的第1.6.7.1节:

      

    与其他成员不同,实例构造函数不是继承的,并且除了在类中实际声明的实例之外,没有实例构造函数。如果没有为类提供实例构造函数,则会自动提供没有参数的空构造函数。

  2. 是的,派生类构造函数的构造函数链将始终通过其基类构造函数...虽然它可能是间接的,因为它可以通过this(...)链接到同一个类中的另一个构造函数而不是base(...)。如果您未指定this(...)base(...),则相当于base() - 在基类中调用无参数构造函数。

  3. 有关详细信息,请参阅我的article on constructor chaining

答案 1 :(得分:1)

1。 不能继承构造函数,但可以链构造函数。例如:

public class DerivedClass : BaseClass {
  public DerivedClass(object arg):base(arg){}
}

2。是的,例如,您无法实例化一个派生自具有所有私有构造函数的对象的类(除了Jon在其评论中提到的特定场景中)。您不能跳过基类的构造函数,但可以有多个重载,并选择您选择使用的构造函数。

3。是的,不确定这里的问题是什么。

答案 2 :(得分:0)

1是

2你不能跳过构造函数,但我认为你在默认构造函数中什么都不做。就像

public class PClass {

    protected PClass() {
        // do nothing
    }

    public PClass(int myIntArg) {
        // initialize the class
    }

}

public Class CClass : PClass {

    public CClass(string myStringArg) : base() {
        // initialize the class
    }

}

3是的。请参阅我之前的示例。