覆盖:子类中类槽的INITFORM

时间:2016-07-28 10:08:05

标签: common-lisp clos

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

示例:

(defclass class-b (class-a)
  ((slot-2 :initarg :slot-2 :initform 0)))

它的子类是

#'IDENTITY

(lambda (&rest x) x) 不足以作为默认值,稍微更为通用

:INITFORM

会更好地适应,因为它期望多个论点(我认为它与Liskov原则并不矛盾)。覆盖CLASS-B的{​​{1}}的最佳方法是什么?

  1. 我可以为INITIALIZE-INSTANCE :AFTER添加CLASS-B,看看SLOT-1是否设置为#'IDENTITY并覆盖它。
  2. 如果我在SLOT-1中重新引入CLASS-B会怎样?我想避免它,因为我必须重复它的所有插槽信息。

2 个答案:

答案 0 :(得分:6)

  

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

有效。

  

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

没有。只有差异。

答案 1 :(得分:4)

简单的替代方法是为班级使用:default-initargs而不是:initform作为广告位。在这种情况下,您只需为子类中的该槽提供新的default-initarg。有关:default-initargs的信息,请参见Chris Riesbeck's rationale,有关示例,请参阅this lisptip