hel*_*rld 44 c# oop constructor
假设有一个基类A和一个B派生自的类A.然后,我们知道类的构造函数A永远不会被类继承B.但是,当B创建新对象时,则会A调用类的默认构造函数,然后调用类的默认/自定义构造函数B.也许这样做的目的是A需要将类的字段初始化为默认值.
现在,假设该类A已定义了自定义构造函数.这意味着A编译器会以静默方式删除类的默认构造函数.现在,在创建一个新的类实例时B,A在调用类B的构造函数之前会自动调用哪个类的构造函数?(A在这种情况下,类字段如何初始化?)
Jon*_*eet 59
现在,在创建一个新的类实例时
B,A在调用类B构造函数之前会自动调用哪个类的构造函数?
基本上,代码将无法编译.每个构造函数都必须隐式或显式地链接到另一个构造函数.它链接到的构造函数可以在同一个类(with this)或基类(with base)中.
像这样的构造函数:
public B() {}
Run Code Online (Sandbox Code Playgroud)
隐含地:
public B() : base() {}
Run Code Online (Sandbox Code Playgroud)
...如果你根本没有指定构造函数,它将以相同的方式隐式添加 - 但它仍然需要调用.例如,你的场景:
public class A
{
public A(int x) {}
}
public class B : A {}
Run Code Online (Sandbox Code Playgroud)
导致编译器错误:
错误CS7036:没有给出说法,对应于所需形式参数
'x'的'A.A(int)'
但是,您可以显式指定不同的构造函数调用,例如
public B() : base(10) {} // Chain to base class constructor
Run Code Online (Sandbox Code Playgroud)
要么
public B() : this(10) {} // Chain to same class constructor, assuming one exists
Run Code Online (Sandbox Code Playgroud)
一旦提供了自己的构造函数class A,在class B对象创建期间就不会发生自动调用.
class B构造函数中的第一行应该是super(paramsToClassAConstructor)或者可以在class Busing中调用另一个构造函数this().在这种情况下,第二个构造函数负责class B调用class A构造函数.