Функция initialize-instance предоставляет возможность повторной инициализации существующих объектов значениями по умолчанию, заданными в определении класса, или новыми переопределениями слотов. Возвращаемое значение функции — имя объекта в случае успешного выполнения операции или значение false в случаи ошибки. Параметр <объект> должен быть именем объекта, адресом объекта или строкой. Функция initialize-instance автоматически приостанавливает процесс сопоставления всех активных объектов правил до тех пор, пока операция не будет завершена. Если подобное поведение нежелательно, используйте функцию active-initialize-instance.
Определение 11.19. Синтаксис функции initialize-instance
(initialize-instance <объект> <переопределение-слота>*)
Функция initialize-instance в процессе выполнения совершает следующие действия:
1. Вычисляются все заданные переопределения слотов, после чего результаты помещаются в соответствующие слоты с помощью сообщений put- (send <объект> put- <имя слота> <значение>).
2. Предопределенный системный обработчик этого сообщения вызывает функцию init-slots. Данная функция использует значения по умолчанию из определения класса (если они есть) для всех слотов, которые не были переопределены. Установки слотов класса по умолчанию помещаются непосредственно в слот без использования сообщений.
|
|
Если при вызове функции не заданы переопределения ни для одного слота или в определении класса не задано ни одно значение по умолчанию, значение слотов объекта останется прежним. Пустые значения по умолчанию (nil) позволяют очищать слоты объекта с помощью вызова функции
initialize-instance.
Если при выполнении функции происходит ошибка, объект не удаляется, но значения слотов могут стать несогласованными.
В качестве демонстрации работы функции initialize-instance создадим класс, представленный в примере 11.43.
Пример 11.43. Класс A
(defclass A (is-a USER)
(role concrete)
(slot x (default 34)
(create-accessor write))
(slot у (default nil)
(create-accessor write))
(slot z (create-accessor write)))
Выполните следующую последовательность действий: