- 内容提要
- 序 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 已死
附二:继承与混合,略谈系统的构建方式
节选自博客文章“继承与混合,略谈系统的构建方式”(2010 年 12 月),文章讨论了对“基于对象系统进行系统构建”的认识与实现。
面向对象系统有三种对象的继承方式,即原型、类和元类。这三种方式都可以构建大型对象系统。在后续讨论之前,我们先在名词概念上做一些强调。所谓“对象系统”,是指由“一组对象构成的系统”,这些对象之间存在或不存在某种联系,但通过一些规则组织起来。所谓“面向对象系统”,是指以上述“对象系统”为基础延伸演化的系统,新系统满足前对象系统的组织规则。
所谓“对象系统的三个要素”——继承、封装与多态,即是上述组织规则的要件。孟岩同学从 C/C++出发 1 ,从另一个侧面谈论对象系统,所持的观点我相当认可。他指出,“对象范式的基本观念中不包括继承、封装与多态”,这一观点有其确切的背景与思考方法,值得一谈。
我们在这里要讨论的是“对象系统”,即对象是如何组织起来的问题。在这个问题上,组织规则之一就是“继承”。JavaScript 中基本的继承模型是原型继承,其特点是“新对象实例的特性,复制自一个原型对象实例”。Qomo 以及其他一些项目,通过语言扩展的方式,在 JavaScript 上添加了类继承的模型,其特点是“对象构建自类,类是其父类的一个派生”,这里的“派生”与“特性复制”有潜在的关系,即子类的特性也复制自父类。正是由于“派生”其实是“特性复制”的一种形式,所以事实上 Qomo 中的类继承是通过原型继承来实现的,因为原型继承本质上也就是“特性复制”。
无论是原型继承、类继承还是这里没有进一步讨论的元类继承,继承的最终目的都是构建一个“对象系统”,而不是“系统”。这一个措辞上小小的区别,有着本质上的深刻意义,这也是我提及孟岩的那一篇文章的原因。通常由“继承”入手理解的“对象系统”其实是静态的,以至于我们在面向对象系统开发的最后一步,仍然需要框架来驱动它。例如 TApplication.Run()
,或者类似的 new Application()
等。继承所带来的,主要仍然是指对象系统的组织性,而非其运行过程中的动态特性。
于是我们通过更多类或其他对象系统,来将一个系统的动态特性静态化。例如将对象之间的交互关系抽取出来,变成控制类。我们做这些事情的目的,仅仅是因为我们约定了对象系统的组织规则,要面向这个对象系统开发,也必然满足(或契合)这一组织规则。组织规则限定了我们构建系统的方式——继承、封装与多态,这在一定程度上说是“对象系统构建”的一个方案,并非“系统构建”的方案。而孟岩在文章中所讨论的,正是“系统构建”的问题。所以孟岩提出两点:
- 程序是由对象组成的;
- 对象之间互相发送消息,协作完成任务。
其中第一条,是对象系统的基本特性,是谓系统成员;第二条,是对象系统如何演进为系统的特性,是谓系统通信。一个系统的约束,既包括其成员(以及成员的组织规则),也包括成员间的通信。
- 参见孟岩的博客文章“function/bind 的救赎”: http://blog.csdn.net/myan/article/details/5928531 。 ↩
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论