CS3L13——继承的基本规则

继承

一个类A 可以继承 另一个类B,继承的类A 会继承 被继承的类B 的所有成员,继承的类A 会拥有 被继承的类B 的所有特征和行为

  • 被继承的类可以称为:父类、基类、超类
  • 继承的类可以称为:子类、派生类

子类可以有自己的特征和行为

特点

  • 单根性:C#的子类只能有一个父类
  • 传递性:子类可以间接继承父类的父类

继承基本语法

1
2
3
4
class 类名 : 被继承的类名
{

}

访问修饰符的影响

  • public​ - 公共 内外部访问
  • private​ - 私有 内部访问
  • protected​ - 保护 内部和子类访问

在命名空间讲到:

  • internal​ - 内部的 只有在同一个项目程序集的文件中,内部类型或者是成员才可以访问

继承使用实例

如果与基类的成员重名会导致基类的成员被隐藏,这不是好的写法,
如果有意覆盖需要在变量类型前加上 new​,但即使这样也不建议这样写,这种写法仍然不好

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class Teacher
{
public string name;
public int number;
protected int age; //protected是保护,意味着这个成员只能在 类 以及 它的子类内使用了
private bool sex; //private是私有,意味着这个成员只能在类里使用,子类不能使用

public void SpeakName()
{
Console.WriteLine(name);
}
}

class TeachingTeacher : Teacher
{

public string subject; //科目

public void SpeakSubject()
{
Console.WriteLine(subject + "老师" + age); // protected 可以在子类使用,而 private 只能不能在类使用
}
}

//C#的类是具有单根性的,也就是说只能继承一个类,派生类的派生类可以继承到基类的成员
class ChineseTeacher : TeachingTeacher
{
//如果与基类的成员重名会导致基类的成员被隐藏,这不是好的写法,如果有意覆盖需要在变量类型前加上new
//但即使这样也不建议这样写 这种写法仍然不好
public new string name;
public void Skill()
{
Console.WriteLine("语文老师的技能");
}
}

internal class Program
{
static void Main(string[] args)
{
TeachingTeacher tt = new TeachingTeacher();
//派生类可以使用基类的成员和方法
tt.name = "liuqi";
tt.number = 1;
tt.SpeakName();
//派生类可以使用自己声明的成员和方法
tt.subject = "unity";
tt.SpeakSubject();

//派生类的派生类可以用基类的方法,派生类的方法
ChineseTeacher ct = new ChineseTeacher();
ct.name = "liuqi";
ct.number = 2;
ct.SpeakName();
ct.SpeakSubject();
ct.Skill();
}
}

输出:

1
2
3
4
5
MrTang
unity老师0

老师0
语文老师的技能