第四章 继承
继承的类型:
实现类型:表示一个类型派生与一个基类型它拥有该基类型的所有成员字段和函数。
接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。
C#支持单继承可以实现多个接口
C#类都有一个基类,还可以有任意多个接口。
结构不支持继承(结构不支持实现继承但支持接口继承)
结构总是派生自System.ValueTpye它们可以派生自任意多个接口
类总是派生自用户选择的另一个类,它们还可以派生自任意多个接口。
虚函数
把一个基类的函数声明为virtual 就可以在任意派生类中重写该函数。
也可以把属性声明为Virtual。对于虚属性或者重写属性语法与非虚属性相同只要在定义中加virtual即可
隐藏方法
如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有分别声明为virtual和override,派生类方法就会隐藏基类的方法。
在C#中,要隐藏一个方法应使用new关键字声明(new放在返回值类型前)
调用函数的基类版本
Base.<mehtName()>
抽象类和抽象函数
抽象类不能实例化,而抽象方法不能直接实现,必须在非抽象的派生类中重写。如果类包含了抽象函数,则该类也是抽象的,也必须声明为抽象的。
密封类和密封方法
C#允许把类和方法声明为sealed,对于类表示该类是不能继承的类。对于方法表示该方法是不能重写的方法。
String就是一个密封类
派生类的构造函数
构造函数的调用顺序是先调用system.object,再按照层次结构由上向下进行,直到到达编译器要实例化的类为止。还要注意在这个过程中,每个构造函数都初始化它自己的类中的字段。这是它的一般工作方式,在开始添加自己的构造函数时,也应尽可能遵循这条规则。
注意构造函数的执行顺序。总是最先调用的正是基类的构造函数。也就是说,派生类的构造函
数可以在执行过程中调用它可以访问的任何基类方法、属性和任何其他成员,因为基类已经构造出
来了,其字段也初始化了。这也意味着,如果派生类不喜欢初始化基类的方式,但要访问数据,就
可以改变数据的初始值。但是,好的编程方式几乎总是应尽可能避免这种情况,让基类构造函数来
处理其字段
base和this 关键字是调用另一个构造函数时允许使用的唯一关键字,其他关键字都会产生编译
错误。还要注意只能指定唯一一个其他的构造函数。