10.1多态类型-静中之动
1.继承时多态的基础,多态是继承的目的
2.职责分离的好处,没有绝对的对和绝对的错,分析的角度不同
3.正如子类型应遵守超类型的规范。同名的函数或方法也应该遵循相同的规范。如果为贪图取名的方便而滥用
重载,早晚会因小失大。
10.2抽象类型
1.抽象是个相对的概念,一个类型是否是抽象的完全取决于设计者对它的角色定位。如果想用它来创建对象,它就是
实例化的具体类型,如果想用它作为其他类型的基类,他就是不可实例化的抽象类型。
2.具体类型是创建对象的模板,抽象类型是创建类型的模板。一个是为对象服务,一个是为类型服务。显然,后者的抽象
正是源于其服务对象的抽象。
值得注意,不要把抽象类型与抽象数据类型混为一谈,后者的抽象指的是类型的接口不依赖其实现,或者说,抽象数据类型的核心
是数据抽象,而抽象类型的合适是多态抽象
3.在学习是应注意从具体知识中领悟抽象思维,在应用时注意用抽象理论来指导具体实践。
类似地,软件开发也是如此,从具体需求中构建出抽象模型,再根据抽象模型来完成具体实现,因此,在设计阶段愁绪类型尤为重要
,在实现阶段是具体类型更为重要
4.不要过度设计,视具体情况
5.接口的意义在于:提供者不是擅作主张,而是推迟决定,让客户选择实现方式。
抽象类的意思在于:父类推迟决定,让子类选择实现方式。
6接口继承不是为了代码重用,而是为了被重用。
7是否有必要愁绪建模,关键看项目需求。如果需求简单而稳定,一步到位又何尝不可?甚至软件的开发效率和运行效率还是高,
如果需求复杂而多变,引入抽象就磨刀不误砍柴工。毕竟抽象不是目的而是手段,对它片面的追求反而导致过度设计。
8针对接口编程,它有一种建立于数据抽象之上的形式,能让用户只关心抽象数据类型和API接口而无视其具体实现。不过,它至少
有两大局限、其一,虽然在接口不变的情况下,实现代码的改变不会影响客户代码,但需要重新编译,对于需要头文件的C++来说,
则需要更多的编译连接时间。其二,虽然相同的接口可以有多实现方法,但他们不同同时存在,更无法动态切换,于是,一种建立于多态抽象
之上的形式应运而生。它把握抽象数据类型隐藏在抽象类型的背后,从而提升抽象接口。同一个抽象接口允许许多种实现并存。且能动态切换
新增,删除或者改变某某种实现。
9没有抽象超类型的具体类型是常见有两种可能,一种是与世隔绝。一辈子几乎不出户,至多在小圈子里活动,典型的有非公有类,内部类,局部
类等等。一种是名满天下的。他的脸就是一张天然名片。
10我们谈到社会身份,不必拘于接口,甚至不必拘于抽象类型,关键是该类型是否具备足够的通用性和规范性。稳定性和独立性。灵活性和专业性
还是应了那句话:抽象不是目的而是手段
11抽象不是目的,而是手段。
12.具体类描述对象,重在实现。抽象描述规范,重载接口
13特别需要注意一种常用的说法:接口是为了克服java中抽象类型不能多重继承的缺点
14 接口 抽象类 接口 抽象类
关系 can-do is-a 重用 规范 代码
共性 相同功能 相同种类 实现 多种 多级
特征 边缘特征 核心特征 重点 可置换性 可扩展性
联系 横向联系 纵向联系 演变 新增类型 新增成员
先从本性上看:接口是一套规范功能规范集合,因此相同的接口代表相同的功能,多表示can-do关系,常用后缀为-able的形容词命名
接口一般表述的是对象的边缘特征,或者说一个对象在某一个方面的特征,因此能在本质不同的类之间建立横向联系,由于一个对象可
拥有多方面的角色特征。故而可有多种接口,接口也可以描述对象的核心特征,但是一个类至多一个这样的接口。
与之相对,抽象类是一类对象的本质属性的凑效,因此相同的抽象基类代表同学的种类,多表示is-a关系,常用名字命名,抽象一般表述的是对象的核心
特征,只能在本质相同的类之间沿着继承树简历纵向联系,由于一个对象通常只有一个核心,故而只有一个基类。
再从目的,接口是为了规范重用,让一个规范有多种实现,看重的是可置换性;抽象类主要为了代码重用,也能规范重用,但更侧重代码重用,能逐级
分步实现基类的抽象方法,看重的是可扩展性。
接口由于被广泛采用的规范,相当于行业标准,一确定不能轻易修改,一旦广泛采用。他的任何改动包括增加接口都会波及整个系统,必须谨慎。
抽象类则没有那么困难。二是可以随意增加方法。所以子类自动扩充