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

Fil*_*ipK 12 oop common-lisp clos

我发现Common Lisp Object System(CLOS)优于传统的(基于类的)面向对象系统.CLOS的维基百科条目提到了两种方法之间的差异 - 主要是CLOS中的多个调度和类和方法的分离.这些仅仅是CLOS的差异或真正优势吗?

Rai*_*wig 20

取决于你所看到的优势.

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

CLOS不会创建类名称空间.CLOS也不会使方法驻留在这些类的类和名称空间中.

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

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

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

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

一个明显可能的优点是,由于CLOS类不捆绑方法和方法可以单独定义,因此不会关闭类和方法集.可以随时添加或删除新方法.这意味着对于新的或更改的功能,人们不需要源代码,以某种方式"重新打开"一个类甚至是子类,以将新功能添加到子类.在CLOS中没有必要的一切.

其他一些可能的优势:

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

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

通常,高级CLOS实现基于它是默认对象系统的想法,但允许对象系统本身的各种自定义.因此,CLOS定义了可能的对象系统的区域,而不是单个固定的区域.默认功能已经非常先进:多继承,动态更新,多分派,方法组合等.

要了解有关CLOS设计理念的更多信息,请参阅以下论文:Common Lisp Object System:

  • 我补充一点,它有利于普通的lisp程序员成为标准的一部分. (2认同)