sbcl / CLOS Почему я должен добавить метод "validate-superclass" здесь?

В SBCL, когда я определяю новый метакласс

CL-USER> (defclass counting-class (standard-class)
   ((counter :initform 0)))
#<STANDARD-CLASS COUNTING-CLASS>

и добавьте метод в GF "make-instance":

CL-USER> (defmethod make-instance :after ((class counting-class) &key)
   (incf (slot-value class 'counter)))
#<STANDARD-METHOD MAKE-INSTANCE :AFTER (COUNTING-CLASS) {25302219}>

Я получаю сообщение об ошибке, если я пытаюсь создать экземпляр:

CL-USER> (defclass counted-point () (x y) (:metaclass counting-class))

The class #<STANDARD-CLASS STANDARD-OBJECT> was specified as a
super-class of the class #<COUNTING-CLASS COUNTED-POINT>, but
the meta-classes #<STANDARD-CLASS STANDARD-CLASS> and
#<STANDARD-CLASS COUNTING-CLASS> are incompatible.  Define a
method for SB-MOP:VALIDATE-SUPERCLASS to avoid this error.

Теперь, если я добавлю необходимое определение:

CL-USER>  (defmethod sb-mop:validate-superclass ((class counting-class)
                                                 (super standard-class))
            t)
#<STANDARD-METHOD SB-MOP:VALIDATE-SUPERCLASS (COUNTING-CLASS STANDARD-CLASS) {26443EC9}>

Оно работает:

CL-USER> (defclass counted-point () (x y) (:metaclass counting-class))
#<COUNTING-CLASS COUNTED-POINT>

Мой вопрос: зачем это нужно?

Из моего POV должно быть достаточно, чтобы объявить счетный класс производным от стандартного класса, как я делал на первом шаге.

1 ответ

Спецификация CLOS MOP для validate-superclass говорит, что метод по умолчанию возвращает t только в тривиальных случаях и добавляет:

Определение метода на validate-superclass требуется детальное знание внутреннего протокола, за которым следует каждый из двух классов метаобъектов класса. Метод на validate-superclass который возвращает true для двух разных классов метаобъектов класса, объявляет, что они совместимы.

Вы могли бы рассмотреть ваши validate-superclass быть заявлением, что вы понимаете, что делаете.

Между прочим, я думаю, что вы можете определить класс, который посчитал бы его экземпляры легче.

PS. Некоторые реализации также возвращают t в некоторых других случаях.

Другие вопросы по тегам