Переопределение: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
? Я хотел бы избежать этого, поскольку мне пришлось бы повторить всю информацию о слоте для него.
2 ответа
Что произойдет, если я снова введу SLOT-1 в CLASS-B?
Оно работает.
Я хотел бы избежать этого, поскольку мне пришлось бы повторить всю информацию о слоте для него.
Нет. Только разница.
На легкой альтернативе стоит использовать :default-initargs
для класса вместо :initform
для слота. В этом случае вам просто нужно предоставить новый default-initarg для этого слота в подклассе. См. Обоснование Криса Рисбека для :default-initargs
и посмотрите этот lisptip для примеров.