Операции над ссылками

 

Мы уже знакомы с одним из способов изменения значения ссылки x : использование инструкции создания в форме create x , позволяющей создать новый объект и присоединить его к ссылке. Имеются и другие интересные операции, доступные при работе со ссылками.

 

Присоединение ссылки к объекту

 

Классы, появляющиеся в этой лекции, не имели подпрограмм - у них были только атрибуты. Как отмечалось, такие классы почти бесполезны, так как у них нет способа изменить значение атрибутов. Необходимы способы модификации ссылок, не использующие при этом инструкций в духе языков Pascal-C-Java-C++, подобных присваиванию: my_beloved.loved_one := me (напрямую изменяющих у объекта поле loved_one ), что нарушает принцип скрытия информации и синтаксически некорректно в нашей нотации.

Для модификации полей объекта клиент обязан вызвать подпрограмму, специально поставляемую разработчиком класса для этих целей. Давайте включим в класс PERSON1 процедуру, позволяющую модифицировать поле loved_one . Вот результат:

 

class PERSON2 feature

name: STRING

loved_one, landlord: PERSON2

set_loved (l: PERSON2) is

-- Присоединить поле loved_one текущего объекта к объекту l.

do

loved_one := l

end

end

 

Процедура set_loved присваивает ссылочному полю loved_one текущего экземпляра PERSON2 значение другой ссылки l . Ссылочное присваивание (левая и правая части являются ссылками) присваивает значение источника (правой части) целевой ссылке (слева).

Эффект ссылочного присваивания очевиден: целевая ссылка становится присоединенной к объекту, к которому присоединен источник - или становится void , если такое значение имеет источник. Предположим, например, что мы начинаем с ситуации, изображенной на рис.8.12 , где поля landlord и loved_one всех изображенных объектов пока пусты.

Рис. 8.12. Перед присваиванием ссылке

Предположим, что выполняется вызов процедуры:

 

a.set_loved (r)

 

Сущность a присоединена к объекту O1 , а сущность r - к O3 . В результате выполнения процедуры set_loved выполнится присваивание:

 

loved_one := l

 

Здесь в роли текущего объекта выступает объект O1 , сущности l и r имеют одинаковое значение - ссылки на объект O3 . В результате изменится значение поля loved_one объекта O1 - ссылка присоединится к другому объекту O3 , как показано на следующем рисунке:

Если бы r было пустой ссылкой, то такой же в результате присваивания стала бы и ссылка в поле loved_one объекта O1 .

Рис. 8.13. После присваивания ссылки