gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:42:57 24 4
gpt4 key购买 nike

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

最佳答案

取决于你认为什么是优势。

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

CLOS 不使类命名空间。 CLOS 也不让方法驻留在类和这些类的命名空间中。

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

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

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

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

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

其他一些可能的优势:

  • CLOS 具有用于组织功能的通用功能。因此,功能不需要分散在类中,而是可以集中在通用函数中。
  • CLOS的调度机制非常灵活。在运行时,可以从一组适用的方法中组装出有效的方法,并且可以以几乎任意的方式控制组装。这样用户就可以实现新的调度方式,而无需更改底层实现。一个例子是按契约(Contract)设计的实现。 CLOS 非常灵活,可以由用户实现。

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

    要详细了解 CLOS 的设计理念,即 Common Lisp 对象系统,请参阅以下论文:
  • CLOS in Context: The Shape of the Design Space (丹尼·博布罗、乔恩·L·怀特、理查德·P·加布里埃尔),1992
  • CLOS: Integrating Object-Oriented and Functional Programming (乔恩·L·怀特、丹尼·博布罗、理查德·P·加布里埃尔),1991
  • 关于oop - CLOS 相对于其他基于类的 OO 系统的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5066355/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com