【问题标题】:What does it mean if a superclass state is not defined in Lisp?如果在 Lisp 中没有定义超类状态,这意味着什么?
【发布时间】:2018-03-11 23:02:26
【问题描述】:

我的超类定义如下:

(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

【问题讨论】:

  • defclass missionary-state (state) 应该做什么?
  • 定义传教士国家阶层。

标签: class common-lisp superclass clos


【解决方案1】:

defclass 的文档中可以清楚地看出,您正在通过扩展父类state 创建missionary-state

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

如果您不希望它成为state 的子类,您只需删除定义中的父类:

(defclass missionary-state ()
  ...)

现在它是standard-objectstandard-class 的直接子类。

【讨论】:

  • 你最后一句话指的是什么?
  • @Michelle 如果你创建一个父类列表为空的类,它将始终从standard-objectstandard-class 继承。如果父列表是(state),那么状态类就是父类,它很可能有已经提到的类作为它的父类。
  • 标准对象和标准类有什么区别?
【解决方案2】:

我的超类定义如下:

(defclass Missionary-state(州)

那不是超类。至少我们不知道它是一个。如果您从此类继承,它可能是一个。你要做的是:

  • 定义一个类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 对象系统)允许对类图进行各种运行时更新。

【讨论】:

  • 感谢您的明确答复。我意识到在加载文件之前我忘记加载和编译另一个文件。这就是为什么我的超类状态是未定义的。
猜你喜欢
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2020-03-20
相关资源
最近更新 更多