Из описания в PCL не понял, как (call-next-method) выбирает нужный метод.
Поскольку я буду обсуждать вопросы создания новых классов только в следующей главе, для понимания вы можете просто представить, что определенные классы уже существуют: предположим, что существует класс bank-account и он имеет два подкласса – checking-account и savings-account. Иерархия классов выглядит следующим образом:
(картинки с иерархией нет в тексте)
(defgeneric withdraw (account amount)
(:documentation "Withdraw the specified amount from the account.
Signal an error if the current balance is less than amount."))
(defmethod withdraw ((account bank-account) amount)
(when (< (balance account) amount)
(error "Account overdrawn."))
(decf (balance account) amount))
(defmethod withdraw ((account checking-account) amount)
(let ((overdraft (- amount (balance account))))
(when (plusp overdraft)
(withdraw (overdraft-account account) overdraft)
(incf (balance account) overdraft)))
(call-next-method))
Функция CALL-NEXT-METHOD является частью системы обобщенных функций и используется для комбинации методов. Она сообщает, что контроль должен быть передан от текущего метода, к методу, специализированному для bank-account.
И нигде нет объяснения почему управление должно передаться именно специализации для bank-account, а из приведённого кода я не понимаю. А если ещё есть десяток методов (withdraw)?