Пример 10.9. Определение приоритета
(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.
Если не был найден метод, применимый к конкретному вызову родовой функции, то такая ситуация расценивается как ошибка выполнения метода.
Значение, возвращаемое родовой функцией
Значение, возвращаемое родовой функцией, является значением, возвращаемым применимым методом с наивысшим приоритетом. Каждый применимый метод может игнорировать или использовать значение, возвращаемое всеми скрытыми методами. Значение, возвращаемое методом, является последним действием, вычисленным в действиях данного метода.
Дата добавления: 2021-12-14; просмотров: 279;