Грань видимости

Обработчики сообщений, присоединенные к некоторому классу, могут непосредственно оперировать со слотами, определенными в этом классе. Однако существует способ напрямую организовать манипуляцию со слота­ми для обработчиков, присоединенных к суперклассу или подклассу. Для этого предусмотрена грань 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)

Или обработчик для составного слота:


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



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