4.8 继承
知识点讲解:光盘:视频\PPT讲解(知识点)\第4章\继承.mp4
类的继承是指从已经定义的类中派生出一个新类。继承是面向对象最重要的特征。如果C#内的一个类直接继承了它基类的成员,这个类就被称为这个基类的子类或派生类。派生类能够从其基类继承所有的成员,包括变量、函数和属性。基类和子类通过继承这个纽带形成了一种层次结构,在应用中可以同时完成不同的功能。
4.8.1 类的层次结构
通过类的继承,将会在项目中生成一个层次结构,所以在使用继承前,应该首先确定各类之间的层次关系。例如,有一个mm类表示俱乐部的基类,一个en类表示英国的俱乐部派生类,一个fr表示法国的俱乐部派生类。那么就可以根据它们间的对应关系画出层次结构图,如图4-6所示。
图4-6 继承关系层次结构图
在上述层次结构关系中,类en和fr都是类mm的子类。所以en和fr都继承了mm的成员,在声明基类时,应该定义其子类中共同拥有的数据成员。例如函数成员和数据成员等,看下面一段代码。
public class mm
{
private string aa;
protected string name;
public string dui;
{
get
{
return name;
}
set
{
name=value;
}
}
public mm()
{
}
public mm(string name)
{
this.name=name;
}
public void Chuli()
{
Console.WriteLine("生成球队!!!!");
}
}
上述代码中,在基类mm内定义了aa、name和dui三个变量成员。
4.8.2 声明继承
继承是在声明类时定义的,其语法格式如下。
修饰符 class 类名 : 基类
{
代码块
}
其中,子类和基类之间用冒号“:”隔开。
4.8.3 继承规则
在C#中,继承规则如下。
(1)除object类外,每个类有且只有一个基类。如果在程序中没有显式制定类的基类,那么它的直接基类就是object。
(2)除构造函数和析构函数之外,所有的基类成员都能被其子类所继承。但是需要注意的是,子类虽然能够继承基类的成员,但是并不能保证这些成员在子类中可以使用,这取决于成员的可访问性。
- 基类中public、internal、protected、internal protected成员被继承后,在子类中依旧是上述访问性成员,并且在子类中可用。
- 基类中private成员被继承后,在子类中依旧是private成员,但是在子类中不可用。
(3)子类可以扩展它的直接基类,能够在继承基类的基础上添加新的成员,但是不能删除集成成员的定义。
(4)继承是可以传递的。例如,如果类C从类B派生,而类B从类A派生,那么C就会继承在B中声明的成员,也能继承在A中声明的成员。但是在各类中使用这些成员时,也需要遵循成员的可访问性。具体说明如下。
- 在类A和B中的public、internal、protected、internal protected成员,在C中依旧是上述访问性成员,并且在C中可用。
- 在A和B中的private成员被继承后,在C中依旧是private成员,但是在C中不可用。
(5)不能循环继承类。例如,下面的代码是错误的。
class a:b
{
}
class b:c
{
}
class c:a
{
}
上述代码中的类存在循环依赖关系,所以运行后将会出现编译错误。
(6)类的直接基类必须至少和类的本身具有相同的可访问性。
(7)在派生子类中可以声明与基类成员相同名称的成员,这样就将基类中的这些成员隐藏了。
(8)类可以声明虚方法、虚属性和虚索引器,而派生子类可以重写上述虚成员。
(9)C#子类只能继承一个直接基类,但是支持基于接口的多重继承。