- 内容提要
- 序 1:程序里的世界
- 序 2:最后一层表象
- 关于本书
- 致谢
- 引言:简单的本源
- 篇一:计算系统
- 第 1 章 数,以及对数据的性质的思考
- 第 2 章 逻辑
- 第 3 章 抽象
- 篇二:语言及其面临的系统
- 第 4 章 语言
- 第 5 章 从功能到系统
- 篇三:程序设计的核心思想
- 第 6 章 数据结构:顺序存储
- 第 7 章 数据结构:散列存储
- 第 8 章 执行体与它在执行过程中的环境
- 第 9 章 语法树及其执行过程
- 第 10 章 对象系统:表达、使用与模式
- 篇四:应用开发基础
- 第 11 章 应用开发的背景与成因
- 第 12 章 应用开发技术
- 第 13 章 开发视角下的工程问题
- 第 14 章 应用程序设计语言的复杂性
- 篇五:系统的基础部件
- 第 15 章 分布
- 第 16 章 依赖
- 第 17 章 消息
- 第 18 章 系统
- 篇六:系统的基本组织方法与原理
- 第 19 章 行为的组织及其抽象
- 第 20 章 领域间的组织
- 附一:主要编程范式 及其语言特性关系
- 附二:继承与混合,略谈系统的构建方式
- 附三:像大师们一样思考——从 UML 何时死掉 谈起
- 附四:VCL 已死,RAD 已死
10.4 可见性同样也是多余的:它是对继承性的补充与展现
我们再来略为讨论一下可见性的问题。
所谓可见,是数据相对于计算(的需要)而言的——如果数据不需要参与计算,则讨论它的可见与不可见本身就失去了意义。我们这里所说的 计算 ,在对象系统中被称为行为/方法(且方法本身也是对象的性质之一)。这些与计算相关的因素,综合起来有如下几种情况。
其一,以一个对象来说,属性若以“被计算数据(P)”和“计算行为(M)”来区分的话,则 P 本身就有对 M 的可见性问题,如图 24 所示。
图 24 对象的数据之于行为的可见性问题
M1 是否可以访问 P1?若可以,那么 M2 能否访问 P1?这个问题的有趣之处在于,在当前我们对对象系统的设计中,Mx 是能访问 Px 的,因为它们是 属于同一个对象的 性质。但是,如果 P1 只需要被 M1 访问,那么 P1 是否应该仅是 M1 的一个私有变量?例如代码:
1 2 3 4 5 6 |
|
显然,身高与体重都是 aman
的性质,但身高与增高有关,与减肥却没什么关系。所以是否应该考虑 height
是 heighten()
的一个私有的、计算用的数据呢?但如果这样, height
难道又不是 aman
的性质了吗?
更进一步说,我们的现状是:让任一方法 M1 都必将面对所有的属性 Px。这在一定程度上增加了对象自身构造时的复杂性。
其二,以一个对象作为系统中待处理的数据来说,则对象本身(与其所有属性)就有对系统的可见问题,如图 25 所示。
图 25 对象之于系统的可见性问题
因为外部系统可能需要了解 P22 与 M22,而并不需要了解 P11 与 M11,因此 P11 与 M11 就应当对外部不可见(内部私有,internal-private),P22 与 M22 就应该是对外部可见的(公开,public)。再者,与上面的一个问题相关,在 P22 与 M22 中又将涉及到 P22 是否需要被公开的问题。
其三,若一个对象作为继承层次中的一层,则对象有对其他末端层次的可见问题,如图 26 所示。
图 26 对象在继承层次上的可见性问题
因为对象 C 的实现可能依赖于一些对象 B 的性质,也可能根本就不依赖某些性质。对于完全不依赖的,就不需要由 B 继承到 C,因此这里的“私有”并不单单表明对象 C 是否可见,而且表明性质 P11/M11 是否要从类继承关系上完全隔离开来,确保对象 C 无法通过继承得到。反之,我们就应该让对象 C 可以继承 P22/M22,以确保其他行为可以访问它们(内部——在继承链上的——保护,internal-protected)。
其四,基于上述问题的进一步设问是:若外部系统中有一个对象是继承自对象 B 而得来的呢?如图 27 所示。
图 27 跨系统继承(对象复用)时的可见性问题
这种情况下,对于 P22/M22,我们仍然需要让外部系统可以在对象 D 中访问到(外部——在继承链上的——保护,protected)。
回顾上一小节的的讨论:多态性是对象的性质在其继承关系上的 表现 ,而本节内容则指出这一 表现 的具体方法(即可见性)包括:
- 可见但限于在内部实现的子类的,即 internal-protected;
- 可见并允许包括外部系统实现的所有子类的,即 protected。
上述分析也表明:如果要在对象继承中,利用子类相对于父类的多态特性,则相关的、在继承链上的性质必然是上述两种可见性的。除此之外,其他的可见性还包括:
- 不可见,即 private;
- 可见但与继承性无关,即 internal 和 public。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论