10

我正在学习 Common Lisp(使用 Lispworks),我现在正试图进入课堂系统。有一个称为标准对象的类,它被定义为

standard-objectstandard-class的实例,并且是除自身之外的所有作为standard-class实例的类的超类。

(取自http://www.lispworks.com/documentation/HyperSpec/Body/t_std_ob.htm#standard-object)所以它是标准类的一个实例

另一方面,标准类标准对象的子类

>(subtypep 'standard-class 'standard-object)
=>T, T

标准对象如何既是标准类的超类又是它的实例?如果我们将标准类定义为子类型,我们应该在定义它的超类型(例如标准对象)之后定义它,那么超类怎么会成为实例呢?还是我的逻辑错了?

4

3 回答 3

12

在此处输入图像描述

CLOS 是一个对象系统,其中 CLOS 概念本身就是一流的对象。类本身就是元类的实例。有一些循环性。

有一个实例standard-object。它是 的一个实例standard-class。它本身就是一个类。所有标准 CLOS 对象都将其作为超类。还有其他类型的对象,例如结构。standard-object所有典型 CLOS 对象的超类也是如此。

standard-class是自身的实例。它是所有类对象的类。由于standard-object也是一个类,所以该类的实例是该类standard-object的一个实例standard-class。由于所有标准类也是 CLOS 对象,因此standard-class继承自standard-object.

CL-USER 22 > (class-of (find-class 'standard-object))
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>

standard-object类对象的类是standard-class

CL-USER 23 > (class-of (find-class 'standard-class))
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>

standard-class类对象的类是standard-class

CL-USER 24 > (find-class 'standard-object)
#<STANDARD-CLASS STANDARD-OBJECT 40F017732B>

standard-object本身就是一个对象和一个类。它是所有 CLOS 对象的超类。

CL-USER 25 > (find-class 'standard-class)
#<STANDARD-CLASS STANDARD-CLASS 40F016A063>

standard-class本身就是一个对象和一个类。它是所有 CLOS 类的超类。

于 2012-10-10T09:44:26.833 回答
2

要理解这一点,您需要了解meta class. 元类的实例是类,类的实例是对象,所以基本上我们有 3 级层次结构。

standard-class是一个元类。standard-object是元类的一个实例,standard-class因此它是类。默认情况下,所有其他用户定义的类都继承自standard-object类。

所以当你创建一个类时,你基本上是在实例化standard-class元类,这个新类是由类继承的standard-object

于 2012-10-10T09:14:19.647 回答
1

我将尝试只回答一个似乎让您感到困惑的问题:

标准对象如何既是标准类的超类又是它的实例?

我希望你熟悉数学中的关系概念。在具有操作的集合上定义的关系。关系的例子包括“被整除”、“是一个”、“等于”等。所以,“是的实例”是一个关系,“是一个子类”也是一个关系。它们绝不相同!子类必须是类,实例可能是类,但通常是别的东西。如果你从自然界举个例子:灵长类动物是哺乳动物的一个子类——这就是“是一个子类”的关系。Lassie(电影中的一条狗)是一种哺乳动物——这是“is instance of”关系的一个例子。

现在,可能让您感到困惑的是,某物的功能,即其他某物的“实例”,是该某物的类。这在自然界中确实不会发生太多,但这是我能想到的:

语言和语法。语法是定义语言的一组规则,语法本身也是一种语言(即它“是”语言的子类),而语言实例化语法规则,因此语言“是”语法的一个实例。

于 2012-10-10T11:42:19.643 回答