Пример 10.7. Перегрузка функции

; Системная функция '+' является неявным методом;#1

; Данный метод имеет следующее определение:
; (defmethod + {(?a NUMBER) (?b NUMBER) ($?rest NUMBER)))

(defmethod + ((?a NUMBER) (?b INTEGER))); #2

(defmethod + ((?a INTEGER) (?b INTEGER))); #3

(defmethod + ((?a INTEGER) (?b NUMBER))); #4
(defmethod + ((?a NUMBER) (?b NUMBER)

($?rest PRIMITIVE))); #5

(defmethod + ((?a NUMBER) (?b INTEGER (>?b 2)))); #6
(defmethod +((?a INTEGER (>?a 2))

(?b INTEGER (>?b 3))));#7

(defmethod +((?a INTEGER (>?a 2)) (?b NUMBER))); #8

Приоритет методов, в приведенном выше примере, будет следующим: #7, #8, #3, #4, #6, #2, #1, #5. В данной ситуации для определения приоритета методы могут быть сразу разбиты на три группы по уменьшению приорите­та с помощью ограничения, заданного для их первого параметра:

Ø методы, которые имеют ограничение и типом и запросом для класса integer (#7', #8);

Ø методы, которые имеют ограничение типа для класса integer (#3, #4);

Ø методы, которые имеют ограничение типа для класса number (#1, #2, #5, #6).

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

(#7, #8) (#3, #4) (#1, #2, #5, #6).

Следующим шагом будет определение приоритета между методами в выде­ленных нами группах, учитывая ограничение по второму параметру. Метод # 1имеет больший приоритет, чем #8, т. к. integer является подклассом number. Метод #3 имеет больший приоритет по сравнению с #4 по той же причине. Методы #6 и #2 имеют приоритет больший, чем методы #1 и #5, т. к. integer является подклассом number. Метод #6 имеет больший приори­тет по сравнению с #2, т. к. #6 имеет ограничение запросом, а #2 нет. Та­ким образом, порядок методов примет следующий вид: #7, #8, #3, #4, #6, #2, (#1, #5)

Ограничение по групповому аргументу дает методу #1 (системной функции + — неявному методу родовой функции +) больший приоритет по сравнению c методом #5, т.к. number является подклассом primitive. Итак, окончательным порядком расстановки методов по приоритету будет такой: #7, #8, #3, #4, #6, #2, #1, #5.

Пример 10.8. Определение приоритета

(defmethod foo ((?a NUMBER STRING))); #1

(defmethod foo (?a INTEGER LEXEME))); #2

Несмотря на то, что класс string является подклассом класса lexeme, поря­док методов будет #2, #1, т. к. integer является подклассом number, а пара number/integer находится левее пары string/lexeme в списке классов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: