本章开始,我们描述了面向对象编程的三个主要概念:封装,继承,动态方法绑定(多钛)。封装允许实现细节隐藏在简单接口之后。继承允许新的抽象定义在已有抽象之上,自动复用已有抽象。动态方法绑定允许在老的抽象上下文中使用新抽象的新行为。

不同的编程语言在不同程度上支持这些基本概念。特别的是,不同语言在要求开发者以面向对象风格编写程序上有所不同。有些作者认为真正的面向对象语言使得写非面向对象的程序非常困难。从纯粹的角度看,一门面向对象语言应该呈现一个统一计算对象模型,数据类型都是类,每个 variable 都是对象的引用,每个 subroutine 都是对象方法。而且,应该从拟人术语来思考对象:作为所有计算活动的实体。

Smalltalk 和 Ruby 比较贴近这种思想。事实上,如后续所述(主要内容在扩充内容),即使流程控制机制,比如选择,迭代在 Smalltalk 中也是方法调用建模。另一方面,Ada 95 和 Fortran 2003 可能是冯诺依曼语言的最佳描述,并且允许开发者以面向对象风格编程。

所以,C++ 如何?它有非常丰富的特性,有些(多重继承,访问控制,严格初始化顺序,析构,模板)在面向对象编程中很有用,但是 Smalltalk 中没有。同时,它也有很多小问题。它的简单类型不是类。可以在类外存在 subroutine。使用 static 方法绑定以及多重继承中的重复问题。不检查的C风格的类型转换给类型检查和访问控制留下了问题。缺少垃圾收集是创建正确,自包含抽象的障碍。可能大多数是由于 C++ 要保留与 C 的兼容,允许开发者不使用面向对象模型。有人建议 C++程序员不要先学 C:他们不希望在新语言中写C风格的程序。总而言之,可以肯定地说 C++ 是一门面向对象语言,就像说 Common Lisp 是一门函数式语言一样。除垃圾收集外,C++ 提供了所有必要的工具,但是开发者确实需要“正确“使用才行。

10.7.1 Smalltalk 对象模型

从历史上看,Smalltalk 是规范的面向对象语言。该语言的原始版本是 Alan kay 在 1960 年代后期在犹他大学攻读博士时设计的。随后被施乐 PARC 的软件概念小组采用,并在 1970 年代经历了五次重要修订。最终形成了 Smalltalk-80 语言。

扩充内容 可以参考到更多内容