我遇到过关于Common Lisp对象系统(CLOS)优于传统(基于类的)面向对象系统的说法。Wikipedia entry for CLOS提到了两种方法之间的差异-主要是多重分派以及CLOS中类和方法的分离。这些仅仅是CLOS的不同之处还是真正的优势?
发布于 2011-02-22 01:30:46
取决于你认为的优势。
与非基于类的面向原型的对象系统相比,First 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 ( Common Lisp Object System )设计理念的信息,请参阅以下文章:
https://stackoverflow.com/questions/5066355
复制相似问题