如果在Lisp中没有定义超类状态,这意味着什么?

时间:2018-03-11 23:02:27

标签: class common-lisp superclass clos

我的超类定义如下:

(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

2 个答案:

答案 0 :(得分:5)

defclass的文档中可以看出,您通过扩展父类missionary-state来创建state

现在,错误消息表明您在定义missionary-state的父类missionary-state之前尝试创建state的实例。它不是标准类,因此您需要告诉系统它是什么。

如果您没有打算成为state的子类,则只需删除定义中的父类:

(defclass missionary-state ()
  ...)

现在它是standard-objectstandard-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对象系统)允许对类图进行各种运行时更新。