Object Reorientation: Generic Functions(重新审视面向对象:广义函数)
Lisp 的发明比面向对象编程的兴起早了几十年。新的 Lisp 程序员们有时会惊奇地发现,原来 Common Lisp 竟是一门非常彻底的面向对象语言。Common Lisp 之前的几个 Lisp 方言开发于面向对象还是一个崭新思想的年代,而那时有许多实验在探索将面向对象的思想(尤其是 Smalltalk 中所展现的形式)合并到 Lisp 中的方式。作为 Common Lisp 标准化过程的一部分,这些实验中的一些被合成在一起,以 Common Lisp Object System (CLOS) 的名义出现。ANSI CL 标准将 CLOS 合并到了语言之中,因此单独提及 CLOS 就不再有任何实际意义了。
CLOS 为 Common Lisp 贡献的那些特性里既有必不可少的,也有相对难懂的 Lisp “语言作为语言的构造工具” 这一哲学的具体表现。本书无法对所有这些特性全部加以介绍,但在本章和下一章里,我将描述其中最常用的特性,并给出关于 Common Lisp 对象的概述。
你应当从一开始就注意到,Common Lisp 的对象系统体现了与许多其他语言相当不同的面向对象的原则。如果你能够深刻理解面向对象背后的基本思想,那么将会感谢 Common Lisp 在实现这些思想时所采用的强大和通用的方式。另一方面,如果你的面向对象经历很大程度上来自单一语言,那么你可能会发现 Common Lisp 的观点多少有些另类。你应当试图避免假设只存在一种方式令一门语言支持面向对象。 如果你几乎没有面向对象编程经验,那么也应当不难理解这里的解释,不过文中偶尔比较其他语言做同样事情的方式的内容,你就只好跳过不看了。