Обработчики сообщений, присоединенные к некоторому классу, могут непосредственно оперировать со слотами, определенными в этом классе. Однако существует способ напрямую организовать манипуляцию со слотами для обработчиков, присоединенных к суперклассу или подклассу. Для этого предусмотрена грань visibility. Значение private указывает, что только обработчики сообщений определяемого класса могут иметь прямой доступ к слоту. Это значение задается по умолчанию. Объявление данной грани со значением public определяет, что обработчики сообщений подклассов, которые наследуют слот, а также суперклассы, тоже могут непосредственно обращаться к слоту.
Грань акцессоров
Акцессор слота — это особый обработчик сообщений, присоединенный к классу. Такой обработчик позволяет читать или изменять значение некоторого слота класса. Грань акцессора дает возможность управлять процессом автоматического создания подобных обработчиков. Эта грань уже использовалась в предыдущих примерах. Теперь рассмотрим ее более подробно.
|
|
В CLIPS 5.1 акцессор неявно создавался для всех слотов класса. Начиная с версии 6.0 ситуация иная. Пользователь должен самостоятельно определить необходимые ему акцессоры для чтения или записи некоторых слотов. Это удобно, потому что в большинстве случаев акцессоры не используются, т. к. все обработчики могут напрямую манипулировать со значениями слотов класса. Грань create-accessor сообщает CLIPS, что он должен автоматически создать явные обработчики сообщений для чтения и/или записи слота. По умолчанию акцессоры не создаются.
Созданные CLIPS акцессоры являются обычными обработчиками сообщений, ими можно манипулировать обычном образом. Однако, в отличие от обработчиков, созданных пользователем, они не имеют печатной формы (т. е. пользователь не может посмотреть код их реализации), и их нельзя удалить или изменить.
Если грань create-accessor получает значение read, то CLIPS автоматически создаст следующий обработчик:
Определение 11.4. Акцессор чтения
(defmessage-handler <class> get-<slot-name> primary ()
?self:<slot-name>)
Если для этой грани определено значение write, CLIPS создаст обработчик сообщений для простого слота:
Определение 11.5. Акцессор записи простого слота
(defmessage-handler <class> put-<slot-name> primary (?value)
(bind?self:<slot-name>?value)
Или обработчик для составного слота: