面向对象3--抽象类与组合
1>何为 接口
概念:自己提供给使用者调用自己功能的方法/入口
接口提取了一群类共同的函数,可以把接口当做一个函数的集合,然后让子类去实现接口中的函数。
这么做的意义在于归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使
用时,从用法上来说都一样。
举个例子,如下,初衷是继承父类的子类都有相同的方法名(这样别人调取方便,因为只要是继承这个类
实例化的对象,那么肯定都有这个方法),但是都是各自实现(比如人say hello,狗是汪汪叫)。
很显然,这样写是没有意义的,甚至完全没有实现开始的想法,要想“有意义”的实现之前的初衷,引入 抽象类的概念
2>抽象类
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据
属性和函数属性。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,
只能被继承,且子类必须实现抽象方法。
python需要借助模块实现抽象类。
把上面的例子,稍加修改,就实现了抽象类,如下,Interface类只需定义方法,无需实现功能,而继承它的子类则必须实现
它定义的方法,否则会报错,因子类没有定义抽象方法
这样才是实现了真正的 归一化,不管你是 人类,狗类,猫类,只要你继承了你们共同属性抽取出来的这个抽象类,那么
实例出来的人,狗,猫,就都有say方法,并且就是这个名称,
len的例子
再例如:linux中一切皆文件的思想:不管是普通的文本文件,可执行文件,甚至一块网卡,它都有 读/写 功能,作为使用者
去编辑这些文件的时候,根本不必考虑对象究竟是.txt,还是.conf。
3>抽象类与接口
抽象类的本质还是类,指的是一组类的相似性,包括数据属性和函数属性,而接口只强调函数属性的相似性。
4>组合
在一个类中以另外一个类的对象作为数据属性,称为组合
举个例子,如下,试想一个场景,要查看老师的的授课信息,你可能会想,定义一个teacher类,把老师的属性和课程
的属性都写进去,再定义个方法查看就好了。恩,那我要查看100个老师的授课信息,要定义100个类吗?
你想:由于每个老师的授课信息可能相同或者不同,那可以抽取相同的课程写一个类,让老师继承啊,nonono
他们之间根本不是 “什么是什么”的关系,不要滥用继承,那根本没意义,如这种两个类之间关联不大,但是又确实存在
联系时,可以用组合类。
所以,组合类也是代码重用的一种实现方式