Переинициализация существующих объектов

Функция 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)))

Выполните следующую последовательность действий:


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



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