假设我有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
并且只填充 slotb-1
怎么办?
PS。为什么有用:如果实现了一些直接继承的A
通用方法,而不添加任何新内容。B
在另一种方法中,将实例A
作为一个插槽B
,我需要编写简单的方法包装器来在该插槽上调用这些方法。
我能想到的唯一方法:在辅助构造函数中分解对象A
并将相应的插槽传递给make-instance
for 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)))
有没有更好的方法来做到这一点?(或者也许,这种方法会导致非常糟糕的设计,我应该完全避免它?)