C#OOP CH06 初识继承和多态
本章目标:
- 理解继承的概念
- 熟练使用继承建立父类和子类
- 理解多态的概念
- 会重写虚方法实现多态
1. 继承概述
1.1 什么是继承
继承: 是指根据一个或者多个现有类,抽离出公有的字段、属性和方法,创建一个新类的过程
1.2 继承详解
- 作用: 实现代码的复用
- C#通过 :(冒号) 来实现继承 java通过extends关键字实现继承
- 父类(基类) : 所有子类公有的字段 属性 行为
子类(派生类): 子类特有的字段 属性 行为 - 子类继承父类后,子类具有: 父类的 + 子类的
- 一个父类可以有多个子类
一个子类只能继承一个父类 – 单一继承 - 继承具有传递性:
子类是可以继承父类的特性,同时子类也可以作为其他类的父类
子类可以重写继承自父类的方法 及方法名 和参数列表与父类的方法相同(使用override)
子类利用重写修改父类的方法,当子类对象的重写方法被调用时(无论是通过子类的引用还是
父类的引用调用),运行的都是子类重写修改后的版本 - C#规定: 构造子类之前必须先构造父类
若子类没有显式调用父类的构造 则编译器会子类构造方法()括号之后加上:base() 调用父类无参构造
若父类没有无参构造 则子类必须显式调用父类有参构造 否则编译器会报错
若子类调用了父类构造 则编译器不会再添加默认构造 - C#可以使用base关键字调用父类的构造方法 属性 以及普通方法 Java使用super关键字
- is a 的使用: if(父类对象 is 子类){} //is用来判断对象是否属于给定的类型
- as a 的使用: 子类 变量名 = 父类变量名 as 子类 //as可以将父类引用强制转换为子类引用
2. 多态
2.1 什么是多态
多态(Polymorphism,动态绑定) : 多种形态 指的是执行期间判断所引用的对象的实际类型,根据实际类型调用其相应的方法
2.2 多态的意义
同一个类型的引用 指向不同的对象时 会有不同的实现
例如:Employee对象指向不同的对象(SE,PM)时,调用方法时会有不同的实现
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果
例如:PM对象和SE对象SayHi()的内容不同
2.3 多态的表现形式
方法的重写:
父类中定义方法时,使用virtual 关键字定义为虚方法 ,而子类中定义父类中方法名相同,参数列表也相同的方法时,使用override关键字修饰 就实现类对父类方法的重写,若使用new关键字修饰 则是添加新的方法
方法的重载:
就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同。调用方法时通过传递给它们的不同个数和类型的参数,以及传入参数的顺序来决定具体使用哪个方法
重写与重载的区别:
重写: 发生在父子类中 方法名相同 参数列表相同 方法体不同 遵循运行期的绑定 看对象的类型来调用方法
重载: 发生同一个类中 方法名相同 参数列表不同 方法体不同 遵循编译期的绑定 看引用的类型来绑定方法
2.4 多态存在的三个条件
- 要有继承
- 要有重写
- 父类引用指向子类对象
3. 不同形态的类
密封类
静态类
抽象类
一、抽象类
在C#中的抽象类就是设计为被继承的类,它只能用作其他类的基类。
对于抽象类来说,它有以下几个特征:
1、抽象类不能创建实例,也就是说抽象类不能实例化;
2、用abstract修饰符来声明抽象类;
3、抽象类中可以包含抽象成员或普通的非抽象成员
4、抽象类可以自己派生自另一个抽象类;
5、任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员,除非派生类自己也是抽象类。
二、密封类
抽象类必须用作基类,但是密封类恰恰与之相反。如果我们自己编写的类不希望被继承,或者有些类没有继承的必要,那我们就应该用密封类来实现。
密封类有如下特点:
1、密封类只能用作独立的类,不能被用作基类;
2、密封类使用sealed修饰符来声明。
三、静态类
静态类中所有成员都是静态的,静态类用于存放不受实例数据影响的数据和函数。
静态类的一个常见的用途可能就是创建一个包含一组数学方法和值的数学库。
静态类有如下特征:
1、静态类必须标记为static;
2、静态类的所有成员必须是静态的;
3、静态类可以有一个静态构造函数,但不能有实例构造函数,不能创建该类的实例;
4、静态类是隐式密封的,也就是说不能继承静态类;
5、可以使用类名访问它的成员。