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

Oop CLOS相对于其他基于类的OO系统的优势,oop,common-lisp,clos,Oop,Common Lisp,Clos,我遇到过这样的说法,即公共Lisp对象系统(CLOS)优于传统的(基于类的)面向对象系统。提到了这两种方法之间的差异——主要是多重分派以及CLOS中类和方法的分离。这些仅仅是CLO的区别还是真正的优势?取决于您认为的优势。 第一个CLOS是基于类的对象系统,与非基于类的面向原型的对象系统相比。CLOS具有具有多重继承的类。CLOS对象是类的实例 CLOS不生成类名称空间。CLOS也不会使方法驻留在这些类的类和名称空间中 这意味着CLOS不是消息传递OO。不向某个对象传递消息,然后该对象在其中运行

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

取决于您认为的优势。

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

CLOS不生成类名称空间。CLOS也不会使方法驻留在这些类的类和名称空间中

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

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

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

有几件事与其他基于类的OO系统不同——上面已经提到了每个类缺少名称空间以及方法不是按类组织的。由于CLOS不是消息传递OO,所以将发送到某个对象的所有消息转发到另一个对象并不适用-如果没有消息传递,则无法转发不存在的消息

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

其他一些可能的优势:

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

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

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

要了解有关CLOS(通用Lisp对象系统)设计理念的更多信息,请参阅以下文章:

  • (丹尼·博布朗、乔恩·怀特、理查德·加布里埃尔),1992年
  • (乔恩·怀特、丹尼·博布朗、理查德·加布里埃尔),1991年

+1。在实践方面,多种方法是减少有时不受欢迎的耦合和总是不受欢迎的样板文件的一种强大方法,这种样板文件带有双重分派和访问者模式。元对象协议的使用有点深奥,但我喜欢契约式设计的例子。我要补充的是,对于普通的lisp程序员来说,它作为标准的一部分具有优势。