CS3L15——继承中的构造函数

本章代码关键字

1
2
this    //代表类自己的构造函数
base //代表父类的构造函数

继承中的构造函数

特点:当实例化一个子类对象时,执行顺序是先执行父类的构造函数 再执行子类的 从最开始的基类开始 依次一代一代向下执行

注意!父类的无参构造很重要,子类构造函数默认会调用父类无参构造函数
子类的构造函数必须要调用父类的一个构造函数,子类可以通过 base​ 关键字 来指定调用父类的某个构造函数

注意要区分 base​ 和 this​ 的区别,base​ 是基类的构造函数,而 this​ 是类自己的构造函数

继承中构造函数的执行顺序

父类的父类的构造 ——> … 父类构造 ——> … ——> 子类构造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class GameObject
{
public GameObject()
{
Console.WriteLine("GameObject的构造函数");
}
}
class Player : GameObject
{
public Player()
{
Console.WriteLine("Player的构造函数");
}
}

class MainPlayer : Player
{
public MainPlayer()
{
Console.WriteLine("MainPlayer的构造函数");
}
}

internal class Program
{
static void Main(string[] args)
{
MainPlayer mp = new MainPlayer();
}
}

输出:

1
2
3
GameObject的构造函数
Player的构造函数
MainPlayer的构造函数

通过 base 调用指定父类构造

父类的无参构造函数很重要,如果父类的无参构造不存在或者被顶掉,子类构造函数又不调用父类构造函数,就会报错
因为实例化子类时会自动调用父类的构造函数,没有无参构造就无法默认执行父类无参构造函数,除非使用 base​ 方法使其使用别的有参构造函数

注意:要区分 base​ 和 this​ 的区别,base​ 是基类的构造函数,而 this​ 是类自己的构造函数

子类的所有构造函数想要执行,都需要先执行父类的一个构造函数,无论是用 base​ 或者用 this​(间接调用)方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Father
{
public Father(int i)
{
Console.WriteLine("Father构造");
}
}

class Son : Father
{
//如果想要用子类调用父类的有参构造函数则需要使用base,子类的所有构造函数想要执行,都需要执行父类的构造函数
public Son(int i) : base(i) //相当于将子类的构造函数参数传入父类的构造函数参数内
{
Console.WriteLine("Son的一个参数的构造函数");
}

public Son(int i, string str) : this(i) //将该函数传入的参数i传入这个类里的另一个只有参数i的构造函数
{
Console.WriteLine("Son的两个参数的构造函数");
}
}

internal class Program
{
static void Main(string[] args)
{
Son s = new Son(1, "123");
}
}

输出:

1
2
3
Father构造
Son的一个参数的构造函数
Son的两个参数的构造函数