假设有一个基类A
和一个从A
派生的类B
。
然后,我们知道 A
类的构造函数永远不会被 B
类继承。但是,当 B
的新对象被创建时,类 A
的默认构造函数在类 B< 的默认/自定义构造函数之前被调用
被调用。也许这样做的目的是类A
的字段需要初始化为默认值。
现在,假设类 A
定义了一个自定义构造函数。这意味着 A
类的默认构造函数被编译器静默删除。现在,在创建类 B
的新实例时,在调用类 B
的构造函数之前会自动调用类 A
的哪个构造函数? (在这种情况下,类 A
字段如何初始化?)
最佳答案
Now, on creating a new instance of class
B
, which constructor of classA
is automatically called before invoking the classB
constructor?
基本上,代码将无法编译。每个构造函数都必须隐式或显式地链接到另一个构造函数。它链接到的构造函数可以在同一个类中(使用 this
)或基类(使用 base
)。
像这样的构造函数:
public B() {}
是隐含的:
public B() : base() {}
... 如果您根本没有指定构造函数,它将以相同的方式隐式添加 - 但它仍然必须有一些东西可以调用。例如,您的场景:
public class A
{
public A(int x) {}
}
public class B : A {}
导致编译器错误:
error CS7036: There is no argument given that corresponds to the required formal parameter
'x'
of'A.A(int)'
但是,您可以显式指定不同的构造函数调用,例如
public B() : base(10) {} // Chain to base class constructor
或
public B() : this(10) {} // Chain to same class constructor, assuming one exists
关于C# 继承和默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29959839/