OOPinheritance和默认构造函数

假设有一个基类A和一个从B派生的类B 然后,我们知道类A的构造函数永远不会被类Binheritance。 但是,当创buildB的新对象时,则在调用B类的默认/自定义构造函数之前调用类A的默认构造函数。 也许这样做的目的是类A的字段需要被初始化为默认值。

现在,假设类A定义了一个自定义的构造函数。 这意味着类A的默认构造函数被编译器自动删除。 现在,创build一个B类的新实例,在调用类B的构造函数之前,会自动调用A类的构造函数? (在这种情况下, A类字段是如何初始化的?)

现在,创build一个新的B类实例,在调用B类构造函数之前自动调用A类的构造函数?

基本上,代码将无法编译。 每个构造函数都必须隐式地或显式地链接到另一个构造函数。 它链接到的构造函数可以在相同的类(与this )或基类(与base )。

像这样的构造函数:

 public B() {} 

隐含的是:

 public B() : base() {} 

…如果你根本没有指定一个构造函数,它将以同样的方式被隐式地添加 – 但它仍然需要调用一些东西。 举个例子,你的场景:

 public class A { public A(int x) {} } public class B : A {} 

导致一个编译器错误:

错误CS7036:没有给出的参数对应于'AA(int)'所需的forms参数'x' 'AA(int)'

但是,您可以明确指定不同的构造函数调用,例如

 public B() : base(10) {} // Chain to base class constructor 

要么

 public B() : this(10) {} // Chain to same class constructor, assuming one exists 

一旦您向class A提供了自己的构造函数,就不会在创buildclass B对象时发生自动调用。

class B构造函数中的第一行应该是super(paramsToClassAConstructor)或者可以使用this()调用另一个构造函数。 在这种情况下, class B中的第二个构造函数负责调用class A构造函数。

当构造函数完成执行时 – 对象处于有效的初始状态。 我们应该使用有效的对象。
当我们为类A提供一个非默认的构造函数时,我们有效地说 – 构造类A对象即处于有效的初始状态 – 我们需要更多的信息 – 这是由参数提供的。
鉴于此,编译器帮助生成默认的构造函数。 客户端代码将无法编译(因为它应该 – 我们将如何使对象的土地处于有效状态?),客户端程序员将不得不坐下来注意。
当你提供一个明确的空构造函数 – 你正在有效地告诉编译器 – 我知道我在做什么 – 默认构造函数很可能将字段初始化为一些合理的默认值。
或者为了促进重用 – 默认构造函数可以使用一些默认值调用非默认构造函数。
一个子类知道它的超类 – 一个子类构造函数可以调用超类方法 – (一些通常在子类中重用的方法)。 鉴于上述情况 – 这要求超类部分应该处于有效状态 – 即其构造函数在其任何方法调用之前执行 。 这需要在子类构造函数之前调用超级构造函数。
鉴于此 – 您将很容易能够devise您的构造函数来强制执行正确的初始状态行为