Листинг 7.1. Объявление классов на языке CLIPS
(defclass person (is-a USER)
(defclass quaker (is-a person)
(defclass republican (is-a person)
(defclass republican-quaker
(is-a republican quaker) (role concrete)
Список формируется в результате прослеживания графа связей системы классов, который неявно представлен слотами is-a в определениях классов.
Роль списка предшествования классов становится ясной при разработке обработчика событий для производного класса. Определим поведение классов quaker и republican как "голубей" и "ястребов" соответственно:
(defmessage-handler quaker speak () (printout t crlf "Peace")
)
(defmessage-handler republican speak ()
(printout t crlf "War") )
Сформируем экземпляр класса republican-quaker:
(definstances people
(richard of republican-quaker))
(send [richard] speak)
(defclass republican-quaker
(is-a quaker republican)
(role concrete) )
(defmessage-handler person speak ()
(printout t crlf "Beer") )
Слоты данных в языке COOL также поддерживают фацеты, т.е. свойства, ответственные за доступ к слотам в процессе работы программы. Например, существует фацет visibility (видимость), который определяет, какие другие классы могут обратиться к слоту. Значение private означает, что только обработчик сообщения данного класса может получить доступ к данным, а значение public позволяет это сделать также обработчикам сообщений производных классов и суперклассов.
Другие фацеты позволяют реализовать следующие возможности:
- автоматическое определение функций доступа и присвоения значений слотам;
- хранение данных, к которым возможен доступ со стороны всех экземпляров класса, аналогично статическим членам классов в языке C++.