Пример 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.
Пример 11.18. Просмотр содержимого общих и локальных слотов
(make-instance b of A)
(send [b] print)
(send [b] put-foo 34)
(send [b] put-woz 68)
(send [a] print)
(send [b] print)
Внимательно рассмотрите поведение общих слотов: при присвоении им значений или создании новых объектов, с динамическими и нединамическими значениями по умолчанию, для общих слотов.
Рис. 11.4. Создание объекта с общими и локальными слотами и присвоение значений
Рис. 11.5. Результат просмотра содержимого общих и локальных слотов
Грани доступа
Существуют три значения грани доступа access, которые могут быть присвоены слоту: read-write, read-only, initialize-only. Грань read-write устанавливается по умолчанию и объявляет, что значение слота можно читать и изменять. Грань read-only объявляет, что из слота можно только читать. Единственный способ установить значение этого слота — использование грань default в определении класса. Грань initialize-only аналогична грани read-only за исключением того, что слот также может быть установлен с помощью переопределения при вызове make-instance (см разд. 11.5.1) и в обработчике сообщений init (см. подразд. "Инициализация объекта" разд. 11.3.3). Заметьте, что слот read-only, который имеет статическое значение по умолчанию, будет неявно иметь общую грань хранения.
Создайте следующую версию класса а и обработчик сообщения для записи в слот bar.
Дата добавления: 2021-12-14; просмотров: 271;