OOP继承和默认构造函数

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)

  • @helloworld:无参数的?绝对.您链接到的构造函数不必由编译器隐式引入 - 它可以是普通的无参数构造函数.或者它甚至可以是一个只有可选参数,或只是一个`params`参数.基本上,只要`:base()`可以工作,就可以了. (2认同)

Bha*_*r R 6

一旦提供了自己的构造函数class A,在class B对象创建期间就不会发生自动调用.

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