(defclass abstract-class ( standard-class )
  (()) ;; pas d'attributs
  (:metaclass standard-class))

(defmethod make-instance ((c abstract-class) &rest args)
  ;;signaler une exception
  (error "~S is an abstract class, cannot be instantiated." c)
  )

(defgeneric isAbstract (c))

(defmethod isAbstract ((c abstract-class)) t)

(defmethod isAbstract ((c standard-class)) nil)

;; une classe abstraite ne peut pas être sous-classe d'une classe non abstraite
(defmethod validate-superclass ((cl abstract-class) (sup standard-class))
  ())

;; une classe abstraite peut être sous-classe d'une classe abstraite
(defmethod validate-superclass ((cl abstract-class) (sup abstract-class))
  t)

;; une classe concrète peut être sous-classe d'une classe abstraite
(defmethod validate-superclass ((cl standard-class) (sup abstract-class))
  t)

;; une classe abstraite
(defclass animal ()
  (()) ;; pas d'attributs
  (:metaclass abstract-class))

;; une classe concrète
(defclass chien (animal)
  (()) ;; pas d'attributs
  )

(make-instance 'chien)