我需要稍微概括子类中的默认槽值.
例:
(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什么?
INITIALIZE-INSTANCE :AFTER的CLASS-B,看看是否SLOT-1被设置为#'IDENTITY和覆盖它.SLOT-1的CLASS-B?我想避免它,因为我必须重复它的所有插槽信息.一个简单的替代方法是:default-initargs用于类而不是:initform用于插槽。在这种情况下,您只需为子类中的该插槽提供一个新的 default-initarg。见克里斯Riesbeck的理由了:default-initargs,看看这个lisptip的例子。