Пример 11.14. Использование грани default-dynamic
(defclass A (is-a USER)
(role concrete)
(slot foo (default-dynamic (gensym))
(create-accessor read)))
Выражение, заданное в грани default-dynamic — вызов системной функции gensym. Эта функция возвращает постоянно увеличивающийся системный идентификатор genX, где X — положительное число, увеличивающееся на единицу с каждым вызовом. Грань create-accessor read обеспечивает возможность чтения значения слота объекта. (Эта грань будет подробно рассмотрена в подразд. "Грань акцессоров" данного раздела.) Очистите CLIPS и создайте несколько объектов класса A так, как представлено в примере 11.15.
Пример 11.15. Создание нескольких объектов класса А
(make-instance al of A)
(make-instance a2 of A)
(make-instance а3 of A)
После этого просмотрите значения слотов foo всех экземпляров объектов класса A.
Пример 11.16. Просмотр содержимого слотов объектов класса А
(send [al] get-foo)
(send [a2] get-foo)
(send [a3] get-foo}
Полученный результат должен соответствовать результату, приведенному на рис. 11.3.
Рис. 11.3.Результат работы грани default-dynamic
Обратите внимание, что значения слотов всех объектов класса а, получивших значения по умолчанию при создании, отличаются друг от друга. Можете повторить выполнение этого примера с использованием грани default вместо default-dynamic и убедиться, что значения всех слотов будут одинаковыми.
Грань хранения
Реальное значение слота копии экземпляра может быть сохранено либо в экземпляре объекта, либо в классе. Грань local определяет, что значение слота будет сохранено с экземпляром. Это установка по умолчанию для грани хранения. Грань shared определяет, что значение сохраняется в классе. Если значение слота сохранено локально, то каждый класс может иметь свое собственное значение слота. Однако, если значение слота сохранено в классе, все экземпляры будут иметь одинаковое значение этого слота. Изменение значения общего слота изменит этот слот во всех экземплярах класса. Такое поведение делает общие слоты похожими на static-члены классов в языке программирования C++.
Если общий слот имеет динамическое значение по умолчанию, то при создании нового объекта данного класса вновь вычисленное значение слота по умолчанию присваивается слотам всех объектов данного класса. Общий слот игнорирует статическое значение по умолчанию, если уже существуют объекты данного класса, и значение данного слота отлично от значения по умолчанию. Если класс является активным, то любые изменения общего слота будут причиной проведения сопоставления образцов для обновления плана решения задачи.
Рассмотрим пример 11.17, демонстрирующий особенности поведения общих и локальных слотов объектов.
Дата добавления: 2021-12-14; просмотров: 269;