13

我遇到过这样的说法,即 Common Lisp 对象系统 (CLOS) 优于传统的(基于类的)面向对象系统。CLOS 的 Wikipedia 条目提到了这两种方法之间的差异——主要是多分派以及 CLOS 中的类和方法的分离。这些仅仅是CLOS的差异还是真正的优势?

4

1 回答 1

20

取决于你认为什么是优势。

首先 CLOS 是一个基于类的对象系统,与非基于类的面向原型的对象系统相比。CLOS 具有多重继承的类。CLOS 对象是类的实例

CLOS 不使类命名空间。CLOS 也不让方法驻留在类和这些类的命名空间中。

这意味着CLOS 不是消息传递 OO。不将消息传递给某个对象,然后该对象运行相应的方法。

历史上早期的 Lisp 对象系统(CLOS 是从该系统开发的)开始是传统的基于类的消息传递系统(LOOPSFlavors)。经过几年的实验和研究,CLOS 模型被认为更适合 Lisp 并且更强大。

CLOS 使用通用函数模型,其主要优点是它更适合函数式编程范式。CLOS 使用泛型函数的函数调用。泛型函数可以有多个参数,并且可以调度多个参数。这适用于 Common Lisp 的其余部分,因为其他函数也可以有多个参数。CLOS 泛型函数也可以传递、从函数返回或存储在数据结构中。所以它们也是一流的功能。如果你发现这些东西(高阶函数和多重分派)有用,那么 CLOS 就有优势。此外,CLOS 通用函数本身就是 CLOS 对象。

一些事情与其他基于类的 OO 系统不同——每个类都没有命名空间,并且方法不是按类组织的,上面已经提到过。由于 CLOS 不是消息传递 OO,因此将发送到某个对象的所有消息转发到另一个对象并不适用 - 如果没有消息传递,我们无法转发不存在的消息。

一个明显的可能优势是,由于 CLOS 类不捆绑方法,并且方法可以单独定义,因此类和方法集不是封闭的。可以随时添加或删除新方法。这意味着对于新的或更改的功能,不需要源代码,以某种方式“重新打开”一个类,甚至子类化一个类来将新功能添加到子类中。所有这些在 CLOS 中都是不必要的。

其他一些可能的优势:

  • CLOS 具有用于组织功能的通用功能。因此,功能不需要分散在类中,而是可以集中在通用函数中。

  • CLOS的调度机制非常灵活。在运行时,可以从一组适用的方法中组装出有效的方法,并且可以以几乎任意的方式控制组装。这样用户就可以实现新的调度方式,而无需更改底层实现。一个例子是按合同设计的实施。CLOS 非常灵活,可以由用户实现。

通常,高级 CLOS 实现基于它是默认对象系统的想法,但允许对对象系统本身进行各种定制。因此 CLOS 定义了一个可能的对象系统区域,而不是一个单一的固定系统。默认功能已经相当先进了:多重继承、动态更新、多调度、方法组合等等。

要详细了解 CLOS 的设计理念,即 Common Lisp 对象系统,请参阅以下论文:

于 2011-02-21T17:30:46.493 回答