Переопределение: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?

  1. Я могу добавить INITIALIZE-INSTANCE :AFTER за CLASS-B и посмотреть, если SLOT-1 установлен в #'IDENTITY и переопределить это.
  2. Что произойдет, если я снова введу SLOT-1 в CLASS-B? Я хотел бы избежать этого, поскольку мне пришлось бы повторить всю информацию о слоте для него.

2 ответа

Решение

Что произойдет, если я снова введу SLOT-1 в CLASS-B?

Оно работает.

Я хотел бы избежать этого, поскольку мне пришлось бы повторить всю информацию о слоте для него.

Нет. Только разница.

На легкой альтернативе стоит использовать :default-initargs для класса вместо :initform для слота. В этом случае вам просто нужно предоставить новый default-initarg для этого слота в подклассе. См. Обоснование Криса Рисбека для :default-initargs и посмотрите этот lisptip для примеров.

Другие вопросы по тегам