- 1、本文档共52页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
继承与聚合 例: 1.是一个…的特殊类型,而非是一个由…所扮演的角色 --通过。预订和购买都是一种特殊类型的交易。 2.永远不需要转化 --通过。一个Reservation对象将保持不变;Purchase对象亦然。 3.扩展,而非重写和废除 --通过。 4.不要扩展一个工具类 --通过。 5.在问题域内,特指一种角色,交易或设备 --通过。是一种交易。 继承适用于此处! 继承与聚合 小结 1.聚合与继承都是重要的重用方法 2.在OO开发的早期,继承被过度地使用 3.随着时间的发展,我们发现优先使用聚合可以获得重用性与简单性更佳的设计 4.当然可以通过继承,以增加可复合的类(enlarge the set of composable classes)。 5.因此聚合与继承可以一起工作 6.但是我们的基本法则是: 优先使用对象聚合,而非(类)继承 区分接口继承与实现继承* 深入分析继承机制,会发现它由两个可分的部分组成: 函数接口的继承 函数实现的继承 作为类的设计者 有时希望派生类只继承成员函数的接口(声明) 有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现 有时则希望同时继承接口和实现,并且不允许派生类改写任何东西 区分接口继承与实现继承 例: abstract class Shape { public abstract void draw(); virtual void error(String msg){ …… } int objectID() { …… } ... }; class Rectangle extends Shape { ... }; class Ellipse extends Shape { ... }; 区分接口继承与实现继承 定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口 声明简单虚函数的目的在于,使派生类继承函数的接口和缺省实现 非虚成员函数表明了一种特殊性上的不变性,因为它表示的是不会改变的行为 区分接口继承与实现继承 Tips: 如果需要简单虚函数,不应将其声明为公有的 决不要重新定义继承而来的非虚函数在C++中,如果要使用实现继承,尽可能使用private继承 面向接口编程 接口表达了对象在交互中的“角色” “应该尽可能的避免实现继承”——Jams Gosling 实现继承打破了类的封装 实现继承增加了耦合 避免 “向下转换” 继承层次 类型系统 类型 一组值 作用于这些值上的操作 在OO世界中,类型(Type)==类(Class) 类型系统 一组禁止误用值的规则 类型表达式、定型断言、定型规则、类型检查算法 可以在运行时检查(动态类型系统),也可在编译时检查(静态类型系统) 类型系统 动态类型系统 编译快,编译器实现简单 程序员修改方便 支持Test-Modify方式 最终仍可以发现错误 静态类型系统 编译仍相当快 运行性能高 可以找出拼写错误 程序自描述性较好 多态性 多态性(polymorphism) 多态变量——一个值在不同上下文中表示不同类型 可以把多态变量看作是一个占位符 多态消息——一个消息不同上下文中有不同的行为(实现) 为限制对“多种类型”的滥用,需要使用继承来附加约束 仅允许将子类型对象的类型“改变”为父类型 多态是和继承密切相关的,正因为有继承,才会有多态出现。多态从字面上的意思应该是多种形态。更进一步,延伸到继承里来,那么多态就应该是具有相同的操作不同的行为的一种特征。 多态性 多态性 问题 为什么要引入多态? 为了支持对类型扩展中涉及的行为扩展——早期的想法 现在呢? 多态性 多态的应用 代替分支语句 使得不同的行为(实现)可以由相同的消息(接口)来引发,以提供更利于重用的封装 留下“扩展点”,便于今后进行扩展 代替“函数指针” 向上转型(upcasting) public?class?Shape{ ? void?draw(){} ? static?void?start(Shape?s){ ?? s.draw(); ?} ?public?static?void?main(String?[]?agrs){ ?? start(new?Circle()); ? ?start(new?Square()); ?} } class?Circle?extends?Shape{ ? void?draw(){System.out.println(“draw?Circle”);} } class?Square?extends?Shape{ ? void?draw(){System.o
文档评论(0)