Допустим, у меня есть класс A
с парой слотов:
(defclass a ()
((a-1 :initarg :a-1)
(a-2 :initarg :a-2)))
И класс B
, наследуемый от A
:
(defclass b (a)
((b-1 :initarg :b-1)))
Если я хочу создать экземпляр B
, make-instance
предложит мне слоты :a-1
, :a-2
и :b-1
.
Вот сумасшедшая идея: что, если я хочу создать экземпляр B
, используя существующий экземпляр A
и заполнив только слот b-1
?
PS. Почему это может быть полезно: если A
реализует какие-то общие методы, которые B
наследует напрямую, не добавляя ничего нового. В альтернативном подходе, делая экземпляр A
слотом в B
, мне нужно было бы написать тривиальные оболочки методов для вызова этих методов в этом слоте.
Единственный способ, который я могу придумать: во вспомогательном конструкторе разложить объект A
и передать соответствующие слоты make-instance
для B
, то есть:
(defun make-b (b-1 a-obj)
(with-slots (a-1 a-2) a-obj
(make-instance 'b :b-1 b-1 :a-1 a-1 :a-2 a-2)))
Есть ли лучшие способы сделать это? (а может быть, такой подход приводит к очень плохому дизайну, и мне следует вообще его избегать?)