Common lisp Override:子类中类槽的INITFORM

Common lisp Override:子类中类槽的INITFORM,common-lisp,clos,Common Lisp,Clos,我需要稍微概括一下子类中的默认插槽值 例如: (defclass class-a () ((slot-1 :initarg :slot-1 :initform #'identity) <...> other-slots<...>)) 但是,#“IDENTITY作为默认值不够好,稍微更一般一些 (lambda (&rest x) x) 将更适合,因为它期待多个参数(我认为它不违背利斯科夫原则)。对于B类,重写:INITFORM的最佳方法是什么 我可以为

我需要稍微概括一下子类中的默认插槽值

例如:

(defclass class-a ()
  ((slot-1 :initarg :slot-1 :initform #'identity)
   <...> other-slots<...>))
但是,
#“IDENTITY
作为默认值不够好,稍微更一般一些

(lambda (&rest x) x)
将更适合,因为它期待多个参数(我认为它不违背利斯科夫原则)。对于
B类
,重写
:INITFORM
的最佳方法是什么

  • 我可以为
    CLASS-B
    添加
    INITIALIZE-INSTANCE:AFTER
    ,查看
    SLOT-1
    是否设置为
    #IDENTITY
    并覆盖它
  • 如果我在
    CLASS-B
    中重新引入
    SLOT-1
    ,会发生什么?我想避免它,因为我必须重复它的所有插槽信息
  • 如果我在B类中重新引入插槽1会发生什么

    它起作用了

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


    不。唯一的区别是。

    在easy alternative中,对类使用
    :default initargs
    ,而不是对插槽使用
    :initform
    。在这种情况下,您只需为子类中的该插槽提供一个新的默认initarg。有关
    :default initargs
    的信息,请参见,有关示例,请参见。

    您只需在子类中添加新的
    :INITFORM
    ,即可添加
    SLOT1
    (无需重复任何其他操作)。根据,使用的是最具体的initform。另请参阅默认initargsGood know!以前从未见过
    :IDEFAULT-INITARGS
    。谢谢
    (lambda (&rest x) x)