Действия обработчиков сообщений

Действия обработчика сообщений представляют собой последовательность выражений, которые выполняются в заданном порядке, при вызове обработчика. Значение, возвращаемое обработчиком — результат вычисления последнего выражения в теле обработчика.

Слотами объекта можно манипулировать, только используя сообщения-акцессоры объекта. Однако обработчики сообщений являются частью объекта, инкапсулирующего данные и методы их обработки. Таким образом, в действиях обработчика можно манипулировать слотами объекта непосред­ственно, минуя механизм сообщений. Кроме того, некоторые функции не­явно оперируют активным экземпляром объекта (так же без использования сообщений). Применять эти функции можно только из обработчиков сооб­щений. Полный список таких функций приведен в гл. 15.

Для доступа к слотам активного экземпляра из действий обработчиков со­общений используется следующая конструкция:

Определение 11.8. Доступ к слоту из обработчика сообщений

?self:<имя-слота>

Приведем пример обработчика сообщений, напрямую манипулирующего со слотами объекта, и определим класс и один обработчик.

Пример 11.34. Использование слотов в обработчиках сообщений класса

(defclass A (is-a USER)

(role concrete)

(slot foo (default 1))

(slot bar (default 2)))

(defmessage-handler A print-all-slots ()

(printout t?self:foo " "?self:bar crlf))

Обработчик сообщения print-all-slots выводит на экран содержимое сло­тов foo и bar. Причем значения, хранящиеся в этих слотах, передаются на­прямую, а не с помощью сообщений.

Помимо получения текущего значения обработчики также могут устанавли­вать новые значения слотов. Для этого используется функция bind.

Определение 11.9. Установка значений слотов в обработчиках сообщений класса

(bind?self:<имя-слота> <значение>*)

Например, для класса а из предыдущего примера можно определить обра­ботчик, приведенный в примере 11.35.


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



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