覆盖:子类中类槽的INITFORM

mob*_*eng 1 common-lisp clos

我需要稍微概括子类中的默认槽值.

例:

(defclass class-a ()
  ((slot-1 :initarg :slot-1 :initform #'identity)
   <...> other-slots<...>))
Run Code Online (Sandbox Code Playgroud)

它的子类是

(defclass class-b (class-a)
  ((slot-2 :initarg :slot-2 :initform 0)))
Run Code Online (Sandbox Code Playgroud)

但是#'IDENTITY作为默认值不够好,稍微更一般

(lambda (&rest x) x)
Run Code Online (Sandbox Code Playgroud)

因为它期望有多个论点(我认为它与Liskov原理并不矛盾)会更适合.覆盖的最佳方法:INITFORM是CLASS-B什么?

  1. 我可以添加INITIALIZE-INSTANCE :AFTER的CLASS-B,看看是否SLOT-1被设置为#'IDENTITY和覆盖它.
  2. 如果我再介绍会发生什么SLOT-1的CLASS-B?我想避免它,因为我必须重复它的所有插槽信息.

Rai*_*wig 6

如果我在CLASS-B中重新引入SLOT-1会怎样?

有用.

我想避免它,因为我必须重复它的所有插槽信息.

不,只有区别.


Xac*_*ach 5

一个简单的替代方法是:default-initargs用于类而不是:initform用于插槽。在这种情况下,您只需为子类中的该插槽提供一个新的 default-initarg。见克里斯Riesbeck的理由了:default-initargs,看看这个lisptip的例子。