暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
第7章 JAVA多形性.pdf
193
26页
0次
2021-02-22
40墨值下载
7 多形性
“对于面向对象的程序设计语言,多型性是第三种最基本的特征(前两种是
数据抽象和继承。
“多形性”(Polymorphism)从另一个角度将接口从具体的实施细节中分离
出来,亦即实现了“是什么”“怎样做”两个模块的分离。利用多形性的概念,
代码的组织以及可读性均能获得改善。此外,还能创建“易于扩展”的程序。
论在项目的创建过程中,还是在需要加入新特性的时候,它们都可以方便地“成
长”
通过合并各种特征与行为,封装技术可创建出新的数据类型。通过对具体实
施细节的隐藏,可将接口与实施细节分离,使所有细节成为“private
(私有)
这种组织方式使那些有程序化编程背景人感觉颇为舒适。但多形性却涉及对“类
型”的分解。通过上一章的学习,大家已知道通过继承可将一个对象当作它自己
的类型或者它自己的基础类型对待。这种能力是十分重要的,因为多个类型(从
相同的基础类型中衍生出来)可被当作同一种类型对待。而且只需一段代码,
可对所有不同的类型进行同样的处理。利用具有多形性的方法调用,一种类型可
将自己与另一种相似的类型区分开,只要它们都是从相同的基础类型中衍生出来
的。这种区分是通过各种方法在行为上的差异实现的,可通过基础类实现对那些
方法的调用。
在这一章中,大家要由浅入深地学习有关多形性的问题(也叫作动态绑定、
推迟绑定或者运行期绑定)。同时举一些简单的例子,其中所有无关的部分都已
剥除,只保留与多形性有关的代码。
7.1 上溯造型
在第 6 章,大家已知道可将一个对象作为它自己的类型使用,或者作为它的
基础类型的一个对象使用。取得一个对象句柄,并将其作为基础类型句柄使用的
行为就叫作“上溯造型”——因为继承树的画法是基础类位于最上方。
但这样做也会遇到一个问题,如下例所示(若执行这个程序遇到麻烦,请参
考第 3 章的 3.1.2 小节“赋值”
252-253 页程序
Music.tune() Instrument
Instrument 衍生出来的所有东西。当一个 Wind 句柄传递给 tune()的时候,就会
出现这种情况。此时没有造型的必要。这样做是可以接受的;Instrument 里的
Wind Wind Instrument Wind
Instrument
Instrument 的完整接口还要小。
7.1.1 为什么要上溯造型
这个程序看起来也许显得有些奇怪。为什么所有人都应该有意忘记一个对象
的类型呢?进行上溯造型时,就可能产生这方面的疑惑。而且如果 tune()简
单地取得一个 Wind 句柄,将其作为自己的自变量使用,似乎会更加简单、直观
得多。但要注意:假如那样做,就需为系统内 Instrument 的每种类型写一个全
新的 tune()。假设按照前面的推论,加 Stringed(乐) Brass(铜管)
这两种 Instrument(乐器)
253-254 页程序
Instrument2 类编写与类紧密相关的方法。这意味着第一次就要求多得多的编程
量。以后,假如想添加一个象 tune()那样的新方法或者为 Instrument 添加一个
新类型,仍然需要进行大量编码工作。此外,即使忘记对自己的某个方法进行过
载设置,编译器也不会提示任何错误。这样一来,类型的整个操作过程就显得极
难管理,有失控的危险。
但假如只写一个方法,将基础类作为自变量或参数使用,而不是使用那些特
定的衍生类,岂不是会简单得多?也就是说,如果我们能不顾衍生类,只让自己
的代码与基础类打交道,那么省下的工作量将是难以估计的。
这正是“多形性”大显身手的地方。然而,大多数程序员(特别是有程序化
编程背景的)对于多形性的工作原理仍然显得有些生疏。
7.2 深入理解
对于 Music.java 的困难性,可通过运行程序加以体会。输出是 Wind.play()。
这当然是我们希望的输出,但它看起来似乎并不愿按我们的希望行事。请观察一
tune()方法:
public static void tune(Instrument i) {
of 26
40墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜