CLOS相较于其他基于类的面向对象系统的优势

13

我看到有人声称Common Lisp Object System(CLOS)优于传统的基于类的面向对象系统。 CLOS的维基百科页面提到了两种方法之间的差异-主要是CLOS中的多重分派和类与方法的分离。这些只是差异还是CLOS的真正优势?

我看到有人声称Common Lisp Object System(CLOS)优于传统的基于类的面向对象系统。 CLOS的维基百科页面提到了两种方法之间的差异-主要是CLOS中的多重分派和类与方法的分离。这些只是差异还是CLOS的真正优势?
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(通用Lisp对象系统)设计哲学的更多信息,请参阅以下论文:


1
在实践层面上,多方法是一种强大的方式,可以减少双重派发和访问者模式所带来的有时让人不愉快的耦合以及总是让人不愉快的样板代码。使用元对象协议可能有些玄学,但我喜欢契约式设计的例子。 - WReach
2
我想补充一下,它的优点是对于通用Lisp程序员来说是标准的一部分。 - Marcin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接