(defmethod foo ((?a MULTIFIELD STRING))); #1
(defmethod foo ((?a LEXEME))); #2
Порядок методов из примера 10.9 будет следующим: #2, #1. Такой порядок определяется тем фактом, что классы первой пары ограничений типов — multifield/iexeme — не связаны, а метод #2 имеет более короткий список классов.
Пример 10.10. Определение приоритета
(defmethod foo ((la INTEGER LEXEME))); #1
(defmethod foo ((la STRING NUMBER))); #2
В данном примере обе пары классов (integer/string и lexeme /number) не связаны. Кроме того, списки классов ограничений имеют одинаковую длину. Таким образом, приоритет будет установлен по порядку создания следующих методов: #1, #2.
Скрытые методы
Если один из методов родовой функции вызывается другим, то такой метод называется скрытым. Обычно, только один метод должен быть применим к конкретному вызову родовой функции. Если для данного вызова существует больше одного применимого метода, родовое связывание выполнит метод с наивысшим приоритетом. Такой подход называется декларативным методом родового связывания.
Однако с помощью функций call-next-method и override-next-method метод родовой функции может вызвать некоторый другой метод данной родовой функции (скрыть вызов). Такой подход называется императивным методом (после вызова некоторого метода он играет роль родового связывания).
|
|
Не рекомендуется использовать данный подход без крайней необходимости. В большинстве случаев обработку вызова с заданным набором аргументов должен осуществлять только один метод.
Помимо функций call-next-method и override-next-method для реализации императивного подхода можно использовать функцию call-specific-method для перегрузки установленного приоритета метода (см. гл. 15).
Ошибки выполнения метода
Если в момент выполнения происходят ошибки, то любое еще невыполненное действие в текущем методе будет прервано, а любой еще невызванный метод не будет вызван. Родовая функция в этом случае вернет значение FALSE.
Если не был найден метод, применимый к конкретному вызову родовой функции, то такая ситуация расценивается как ошибка выполнения метода.
Значение, возвращаемое родовой функцией
Значение, возвращаемое родовой функцией, является значением, возвращаемым применимым методом с наивысшим приоритетом. Каждый применимый метод может игнорировать или использовать значение, возвращаемое всеми скрытыми методами. Значение, возвращаемое методом, является последним действием, вычисленным в действиях данного метода.