第06讲-多态.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第06讲-多态

第六讲 多态性 多态性 编译时多态性 ★★ 运行时多态性 ★★★ 6.1 多态性 什么是多态性(polymorphism)? 通俗解释:一个名字具有多种含义。 为什么程序需要多态性? 表示独立性可提高程序的可扩展性与可复用性。 实现多态性有何途径? 数据:隐式类型转换+强制类型转换。 操作:重载+动态绑定。 缺乏多态性的程序 系统无法自动选择则须由程序员显式地选择。 if (table的类型为A) { 调用A版本的search(); } else if (table的类型为B) { 调用B版本的search(); } else if … 这种程序结构明显降低了程序的可修改性和可扩充性。 ① 程序员必须预先知道table所有可能的类型。 ② 增加新的实现版本时,须修改所有的这些分支结构。 具有多态性的程序 系统能通过某种机制自动选用合适的实现版本。 result = table.search(element); 这种自动选择机制就是面向对象设计的运行时多态性。 计算的核心概念:绑定(binding) 静态绑定(static binding) 在编译期间确定table.search(...)调用的方法体。 ? 传统语言(C、Pascal、Algol 68、...)均使用静态绑定。 动态绑定(dynamic binding) 在运行期间确定table.search(...)调用的方法体。 支持(运行时)多态性的语言必须提供动态绑定机制。 ? C++语言缺省采用静态绑定,支持动态绑定。 ? Java语言缺省采用动态绑定,支持静态绑定。 静态类型 静态绑定利用table的静态类型确定table.search(...)调用的方法体。 ? 静态类型是声明变量时采用的类型! 动态类型 动态绑定利用table的动态类型确定table.search(...)调用的方法体。 ? 动态类型必须是静态类型的子类型! 使用Java语言的静态绑定 缺省情况下,Java语言全部采用动态绑定 这与C++语言的默认绑定方式刚好相反。 ? 这两种语言均同时支持静态绑定与动态绑定! 程序员必须显式地采用静态绑定 将一个方法定义为final的。 两个效果: ? 禁止子类重定义该方法! ? 指示编译程序采用静态绑定! 实现多态性的途径 编译时(静态)多态性 运行时(动态)多态性 6.2 编译时多态性 方法重载 运算符重载(C++) 方法重载 编译器如何选择合适的操作 参数表(基调)必须(must)有区别; 返回类型可以(can)不同。 返回类型不可作为区别 ? 返回类型与异常表都不可作为重载方法的区别。 继承 最大需求 ── 源于构造方法 构造方法的困境:? 通常需要多种方式初始化对象状态。 编译程序如何选择匹配的方法 编译程序根据选择重载方法的次序: ① 寻找形式参数表与实际参数表完全匹配的方法。 ② 寻找由小到大执行隐式类型转换后可匹配的方法 ── 最精确方法。 ? 参数个数不一致的当然不会匹配! 找不到最精确方法则报告一个二义性错误。 在某些情况下会出现这种现象! 6.3 运行时多态性 请求形式:obj.service() 多态性 在运行时obj可以有不同的形式。 动态绑定 obj.service()的效果依赖于obj的运行时形式。 即在编译时无法静态地断定其效果。 运行时多态性=继承+重定义+动态绑定 重定义 重定义(overriding)的目的 允许子类修改从父类继承下来的行为。 ? 最重要的一类修改:实现(为父类的抽象方法提供具体实现) 中文对overriding有不同译法,如覆盖、支配等。 重定义的做法 在子类中定义一个功能不同的方法,但是方法的接口与父类中的某一方法完全相同。 ? 包括名字、返回类型、参数表、异常表…… 重定义 vs 重载 Overriding vs Overloading 共同点:同一方法名表达不同含义。 重 载:子类的方法之间以及子类与父类的方法之间均允许重载。 ? 参数表 ── 必须有不同。 ? 返回类型、异常表 ── 可同,也可不同(即无要求)。 重定义:仅指子类重定义与父类或祖先类的方法。 ? 参数表、返回类型 ── 必须完全相同。 ? 异常表 ── 声明抛出的异常必须兼容。 对象的初始化次序 重定义的注意事项 ① 返回类型必须与父类的方法完全相同。 ② 只能抛出那些父类方法声明抛出的异常。 ? 允许少抛或不抛异常,但禁止抛出父类接口不兼容的异常。 ③ 访问控制必须比父类方法更公开。 ? private

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档