Мне нужно немного обобщить значение слота по умолчанию в подклассе.Override: 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)
подойдет лучше, так как он ожидал несколько аргументов (я думаю, это не противоречит принципу Лискова). Каков наилучший способ переопределить :INITFORM
для CLASS-B
?
- Я могу добавить
INITIALIZE-INSTANCE :AFTER
дляCLASS-B
и посмотреть, еслиSLOT-1
установлен в#'IDENTITY
и переопределить его. - Что произойдет, если я вернусь
SLOT-1
вCLASS-B
? Я бы хотел избежать этого, так как мне пришлось бы повторить всю информацию о слотах.
Вы должны просто добавить 'SLOT1' только с новым': INITFORM' в подкласс (не нужно ничего повторять). Согласно [spec] (http://www.lispworks.com/documentation/HyperSpec/Body/07_ec.htm) используется наиболее конкретная initform. – jkiiski
См. Также default-initargs – coredump