我正在学习Common Lisp(使用Lispworks),而我正试图进入类系统。有一个名为标准对象的类,它被定义为
类标准对象是标准类的一个实例,是每个类的超类,是标准类除了自己。
(摘自http://www.lispworks.com/documentation/HyperSpec/Body/t_std_ob.htm#standard-object) 所以它是标准类
的一个实例另一方面,标准类是标准对象
的子类>(subtypep 'standard-class 'standard-object)
=>T, T
标准对象如何成为标准类的超类并同时成为它的实例?如果我们将standard-class定义为子类型,我们应该在对其超类型(例如标准对象)进行定义之后定义它,那么如何才能使超类成为实例呢?或者我的逻辑是错的?
答案 0 :(得分:13)
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类的超类。
答案 1 :(得分:2)
要理解这一点,您需要了解meta class
的概念。元类的实例是一个类,类的实例是一个对象,所以基本上我们有3级层次结构。
standard-class
是一个元类。 standard-object
是元类standard-class
的一个实例,因此它是类。默认情况下,每个其他用户定义的类都继承自standard-object
类。
因此,当您创建一个类时,您基本上是实例化standard-class
元类,而这个新类是由standard-object
类继承的。
答案 2 :(得分:1)
我会尽力回答一个似乎让你感到困惑的问题:
标准对象如何成为标准类的超类,并且是它的标准类 实例同时?
我希望你熟悉数学关系的概念。在具有操作的集合上定义的关系。关系的例子包括“可被整除”,“是一个”,“等于”等等。所以,“是一个实例”是一个关系,“是一个子类”也是一个关系。它们绝不是一样的!子类必须是一个类,一个实例可能是一个类,但通常它是其他的东西。如果你从自然界中得到一个例子:灵长类动物是哺乳动物的一个子类 - 这就是“是”关系的一个子类。 Lassie(电影中的一只狗)是一种哺乳动物 - 这是“关系实例”的一个例子。
现在,令你感到困惑的是,某事物的功能,即“其他事物的一个实例”就是那个类的东西。这确实不会发生太多,但这是我能想到的:
语言和语法。语法是一组规则,它定义一种语言,语法本身也是一种语言(即“它是”语言的子类),而语言实例化语法规则,因此语言“是语法的实例。” / p>