11.4 基类 (Superclasses)

defclass 接受的第二个参数是一个列出其基类的列表。一个类别继承了所有基类槽的联集。所以要是我们将 screen-circle 定义成 circlegraphic 的子类,

  1. (defclass graphic ()
  2. ((color :accessor graphic-color :initarg :color)
  3. (visible :accessor graphic-visible :initarg :visible
  4. :initform t)))
  5. (defclass screen-circle (circle graphic) ())

screen-circle 的实例会有四个槽,分别从两个基类继承而来。一个类别不需要自己创建任何新槽; screen-circle 的存在,只是为了提供一个可创建同时从 circlegraphic 继承的实例。

访问器及 :initargs 参数可以用在 screen-circle 的实例,就如同它们也可以用在 circlegraphic 类别那般:

  1. > (graphic-color (make-instance 'screen-circle
  2. :color 'red :radius 3))
  3. RED

我们可以使每一个 screen-circle 有某种缺省的颜色,通过在 defclass 里替这个槽指定一个 :initform

  1. (defclass screen-circle (circle graphic)
  2. ((color :initform 'purple)))

现在 screen-circle 的实例缺省会是紫色的:

  1. > (graphic-color (make-instance 'screen-circle))
  2. PURPLE