Грань хранения

Реальное значение слота копии экземпляра может быть сохранено либо в экземпляре объекта, либо в классе. Грань local определяет, что значение слота будет сохранено с экземпляром. Это установка по умолчанию для грани хранения. Грань shared определяет, что значение сохраняется в классе. Если значение слота сохранено локально, то каждый класс может иметь свое собственное значение слота. Однако, если значение слота сохранено в классе, все экземпляры будут иметь одинаковое значение этого слота. Изменение значения общего слота изменит этот слот во всех экземплярах класса. Такое поведение делает общие слоты похожими на static-члены классов в языке программирования C++.

Если общий слот имеет динамическое значение по умолчанию, то при создании нового объекта данного класса вновь вычисленное значение слота по умолчанию присваивается слотам всех объектов данного класса. Общий слот игнорирует статическое значение по умолчанию, если уже существуют объекты данного класса, и значение данного слота отлично от значения по умолчанию. Если класс является активным, то любые изменения общего слота будут причиной проведения сопоставления образцов для обновления плана решения задачи.

Рассмотрим пример 11.17, демонстрирующий особенности поведения общих и локальных слотов объектов.

Пример 11.17. Использование граней хранения

(defclass A (is-a USER)

(role concrete)

(slot foo (create-accessor write)

(storage shared)

(default 1))

(slot bar (create-accessor write)

(storage shared)

(default-dynamic 2))

(slot woz (create-accessor write)

(storage local)))

(make-instance a of A)

(send [a] print)

(send [a] put-foo 56)

(send [a] put-bar 104)

Результат этих действий приведен на рис. 11.4.

Выполните действия, представленные в примере 11.18. (Несмотря на то, что в данном примере используются еще нерассмотренные нами обработчики сообщений, он должен быть интуитивно понятен.) Результат — на рис. 11.5.


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



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