defclass的第二个参数是一个超类的列表。一个类会继承它的所有超类的槽的并集。所以,如果我们想要定义一个screen-circle类,并且它是circle和graphic的子类,
[2]> (defclass graphic ()
((color :accessor graphic-color :initarg :color)
(visible :accessor graphic-visible :initarg :visible :initform t)))
#<STANDARD-CLASS GRAPHIC>
[3]>
(defclass circle screen-circle (circle graphic)
())
那么,screen-circle的实例就会有4个槽,每个超类继承两个。一个类并不强制要求创建自己的新槽;screen-circle的存在仅仅是为了提供一个可实例化的,并且是继承自circle和graphic的东西。
circle和graphic的accessors和initargs在screen-circle也同样有效:
[10]> (graphic-color (make-instance 'screen-circle :color 'red :radius 3))
RED
我们可以使每个screen-cricle有某种初始的颜色,这是通过在defclass中指定这个槽的initform来做到的:
[11]> (defclass screen-circle (circle graphic)
((color :initform 'purple)))
#<STANDARD-CLASS SCREEN-CIRCLE :VERSION 1>
现在screen-circle的实例默认颜色就是purple了:
[12]> (graphic-color (make-instance 'screen-circle ))
PURPLE