通过“继承”技术,实现代码的复用,减少代码的编写量。
因为子类继承父类,拥有了父类所有对外公开“属性”和“方法”,所以,在系统中,完全可以由子类替代父类(里氏替换原则)!在替代的过程中,子类不仅仅能替代父类完成与父类一模一样的业务功能,也可以使用“自己业务逻辑”替代掉“父类原有的业务逻辑”,这样,不同的子类在替换父类时,就能够表现出“不同业务形态”---多态。
“多态”的形式:
形式一: 父类 obj = New 子类(); --- virtual【虚方法】
形式二:抽象类 obj = New 子类(); --- abstruct【抽象方法】、virtual【虚方法】
形式三:接口 obj = New 实现类(); --- 【接口方法】
“抽象方法”及“抽象类”:
抽象方法 ---- 只有方法的描述,而没有具有实现!({ })用于描述本类,想要但无法去实现的“业务功能”!
抽象类 ------- 含有抽象方法,或者被使用abstruct修饰的类。抽象类是不能够使用New创建实例的!
注意: 当一个子类继承了“抽象类”时,您必须实现其“所有的抽象方法”!(除非子类也是抽象的)
三种“多态”形式的比较:
形式一:父类方式,站在“代码实现”的角度,父类为子类提供代码实现的基础,减少新类的代码开发量。
形式三:接口方式,站在“框架设计”的角度,实现多态性。不涉及一点点的代码实现。
形式二:抽象类,是一种折中的方式。既有对子类的“业务支撑”,同时对子类有苛刻的业务要求。【抽象类的语法是最宽泛的:字段、属性、业务方法、构造方法、虚方法、抽象方法。】
虚方法 |
抽象方法 |
virtual |
abstract |
必须有方法体 { } |
不允许有方法体 |
什么地方都行 |
只能”抽象类“中 |
子类可以重写,也可以不重写 |
必须重写 |
如何让我们的代码编写,能体现出OO特性:
------- 从代码实现角度
在编写一个个业务类的过程中,
- 如果,多个类具有“相同的属性”和“相同业务逻辑”的方法,我们就可以将其剪切到一个“父类”中,并让这多个类“继承”于该父类。
- 如果,这多个类实现“同样功能”的方法中,部分类“实现逻辑一致”,个别类实现逻辑不一样,此时,将大部份相同的实现逻辑,剪切到“父类”,但是该剪切的方法使用virtual进行修饰,并将未剪切的类的方法前加上override。
- 如果,这多个类实现“同样功能”的方法中,各自实现的逻辑都不同,此时,只提取方法的签名到“父类”,并使用abstract进行修饰。当然子类使用override重写。
- 如果,不是所有的子类都具有“某功能”,而只有部分子类具有!将其方法签名提取到一个接口中,并让该子类在继承父类的基础上,再继承于该接口。通过该接口实现多态!