Грань переопределения сообщений
Некоторые функции CLIPS устанавливают значения слотов объектов с помощью сообщений, например: make-instance, initialize-instance, message-modify-instance, message-duplicate-instance. По умолчанию все эти функции пытаются установить значение слота с помощью вызова сообщения put-<имя слота>. Если пользователь не задал автоматическое создание акцессоров с помощью грани create-accessor, но хочет, чтобы эти функции работали и могли переопределять значения слотов, то необходимо использовать специальную грань override-massage. Эта грань позволяет задавать имя сообщения, которое будет послано экземпляру объекта некоторого класса, при попытке изменить значение данного слота. Грань override-massage можно также использовать, если стандартные акцессоры существуют, но их применение приведенными выше функциями нежелательно.
В качестве иллюстрации использования этой грани рассмотрим класс из примера 11.26.
Пример 11.26. Использование грани переопределения сообщений
(defclass A (is-a USER)
(role concrete)
(slot special (create-accessor read-write)
(override-message special-put)))
Класс А содержит слот special, который с помощью грани override-massage сообщает среде CLIPS, что для изменения слота special необходимо использовать сообщение special-put, определенное пользователем, а не стандартное сообщение, созданное с помощью грани create-accessor с именем put-special. Определим обработчик сообщения special-put следующим образом (более подробно создание обработчиков сообщений будет рассмотрено в разд. 11.3):
Пример 11.27. Создание обработчика special-put
(defmessage-handler A special-put primary (?value)
(printout t "special-put " ?value crlf)
(bind ?self:special ?value))
Рис. 11.11.Использование обработчиков put-special и special-put
Данный обработчик просто выводит на экран имя сообщения и новое значение слота special.
Выполним последовательность действий, представленную в примере 11.28.
Дата добавления: 2021-12-14; просмотров: 275;