我的超类定义如下:
(defclass missionary-state (state)
((missionary-left :initarg :missionary-left :initform nil :accessor missionary-left
:documentation "the number of missionaries on the left side of the river")
(missionary-right :initarg :missionary-right :initform nil :accessor missionary-right
:documentation "the number of missionaries on the right side of the river")
(cannibal-left :initarg :cannibal-left :initform nil :accessor cannibal-left
:documentation "the number of cannibals on the left side of the river")
(cannibal-right :initarg :cannibal-right :initform nil :accessor cannibal-right
:documentation "the number of cannibals on the right side of the river")
(boat-pos :initarg :boat-pos :initform nil :accessor boat-pos
:documentation "the side the boat is on")))
这是我尝试加载后收到的错误消息:
Error: Class #<STANDARD-CLASS MISSIONARY-STATE>
can't be finalized because superclass STATE
is not defined yet
答案 0 :(得分:5)
从defclass
的文档中可以看出,您通过扩展父类missionary-state
来创建state
。
现在,错误消息表明您在定义missionary-state
的父类missionary-state
之前尝试创建state
的实例。它不是标准类,因此您需要告诉系统它是什么。
如果您没有打算成为state
的子类,则只需删除定义中的父类:
(defclass missionary-state ()
...)
现在它是standard-object
和standard-class
的直接子类。
答案 1 :(得分:2)
我的超类定义如下:
(defclass传教士 - 州(州)
那不是超类。至少我们不知道它是一个。如果你继承这个类,它可能是一个。你做的是这个:
missionary-state
state
state
不是您示例的一部分,因此未定义。 Common Lisp允许您定义具有未定义超类的类。你甚至不需要告诉Common Lisp state
是一个类,它将在以后定义。
但是在创建该类或其子类的实例之前,您需要定义类state
。错误消息告诉您Lisp无法完成类missionary-state
,因为类state
尚不存在 - 名称已知,但没有定义。
通常您只需定义类state
,然后创建实例。如果不可能,那么您也可以这样做:
missionary-state
,而不将state
列为超类。missionary-state
state
missionary-state
以获得超类state
然后,这将更新现有实例,并确保将来的实例使用更新的类包含的信息。超类。这是可能的,因为CLOS(Common Lisp对象系统)允许对类图进行各种运行时更新。