在 C# 中关于构造函数的继承:
- 我读过构造函数不能被继承。
- 如果基类包含一个或多个构造函数,派生类必须总是调用其中一个吗?派生类不可能跳过基类的构造函数吧?
- 派生类可以有自己的构造函数,但它必须调用基类构造函数之一。
这些说法正确吗?
在 C# 中关于构造函数的继承:
这些说法正确吗?
是的,你是对的,构造函数不是继承的。所以仅仅因为Object
有一个无参数的构造函数,并不意味着它String
有一个无参数的构造函数,例如。从 C# 4 规范的第 1.6.7.1 节:
与其他成员不同,实例构造函数不是继承的,并且一个类除了在类中实际声明的实例构造函数之外没有实例构造函数。如果没有为类提供实例构造函数,则自动提供一个没有参数的空实例构造函数。
是的,派生类构造函数的构造函数链将始终通过其基类构造函数......尽管它可能是间接的,因为它可以通过this(...)
而不是链接到同一类中的另一个构造函数base(...)
。如果不指定this(...)
or base(...)
,则相当于base()
- 在基类中调用无参数构造函数。
有关更多信息,请参阅我关于构造函数链接的文章。
1. 不能继承构造函数,但可以链式构造函数。例子:
public class DerivedClass : BaseClass {
public DerivedClass(object arg):base(arg){}
}
2. 是的,例如,您不能实例化从具有所有私有构造函数的对象派生的类(Jon 在下面的评论中提到的特定场景除外)。您不能跳过基类的构造函数,但可以有多个重载,并选择您选择使用的构造函数。
3. 是的,不知道这里的问题是什么。
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 是的。请参阅我之前的示例。