2016-07-28 24 views
1

我需要略微推廣子類中的默認插槽值。覆蓋:子類中的類插槽的INITFORM

例子:

(defclass class-a() 
    ((slot-1 :initarg :slot-1 :initform #'identity) 
    <...> other-slots<...>)) 

它的子類是

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

#'IDENTITY不作爲默認值,稍微更普遍,因爲它預期

(lambda (&rest x) x) 

會適合更好的不夠好多個論點(我認爲這與Liskov原理不矛盾)。 CLASS-B覆蓋:INITFORM的最佳方法是什麼?

  1. 我能爲CLASS-B添加INITIALIZE-INSTANCE :AFTER,看看是否SLOT-1設置爲#'IDENTITY和覆蓋它。
  2. 如果我在CLASS-B中再次引入SLOT-1,會發生什麼情況?我想避免它,因爲我不得不重複所有的插槽信息。
+4

你應該可以在子類中只添加新的':INITFORM'來添加'SLOT1'(不需要重複其他任何事情)。根據[spec](http://www.lispworks.com/documentation/HyperSpec/Body/07_ec.htm),使用最具體的initform。 – jkiiski

+3

另請參見default-initargs – coredump

回答

6

如果我在CLASS-B中重新引入SLOT-1,會發生什麼?

它的工作原理。

我想避免它,因爲我將不得不重複所有的插槽信息。

不,只有區別。

4

簡單的替代方法是使用:default-initargs代替:initform。在這種情況下,你只需要在子類中爲該槽提供一個新的default-initarg。有關示例,請參見Chris Riesbeck's rationale:default-initargs並參見this lisptip

+0

相關知識!之前沒有看過':IDEFAULT-INITARGS'。謝謝 – mobiuseng