CLOS优于其他基于类的OO系统的优势

时间:2011-02-21 13:12:00

标签: oop common-lisp clos

我认为Common Lisp对象系统(CLOS)优于传统的(基于类的)面向对象系统。 Wikipedia entry for CLOS提到了两种方法之间的差异 - 主要是多次调度以及CLOS中类和方法的分离。这些仅仅是CLOS的差异或真正优势吗?

1 个答案:

答案 0 :(得分:19)

取决于您认为的优势。

与非基于类的面向原型的对象系统相比,第一个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设计理念的更多信息,请参阅以下论文: