Основы объектно-ориентированного программирования
0e1cc9b4

Гибридное присоединение


В рассматриваемых до сих пор случаях источник и цель принадлежали одной категории - оба развернутого или ссылочного типа. Что если они из разных категорий?

Вначале рассмотрим ситуацию, когда в присваивании x := y цель x развернутого типа, а источник y - ссылочного типа. Единственно приемлемой в этом случае является семантика копирования: копирование полей объекта, присоединенного к y, в поля объекта, присоединенного к x. Все хорошо, если y не void в период выполнения. Если y - void, то результатом будет включение исключения. (Исключения изучаются в лекции 12)

Для развернутого x тест x = Void не является причиной появления исключительной ситуации; он просто дает значение false. Но нет приемлемой семантики для присваивания x := Void, так что всякая подобная попытка приводит к появлению исключения.

Рассмотрим теперь другой случай присваивания: x := y, где x ссылочного типа, а y - развернутого. Тогда в период выполнения y всегда присоединен к объекту, который мы можем назвать OY, и присоединение также должно присоединить x к объекту. Казалось бы, что можно присоединить x непосредственно к OY. Однако это привело бы к созданию ссылки на подобъект, а подобные ссылки запрещены нашими правилами. Поэтому правильной стратегией является клонирование источника OY и присоединение x к созданной копии. Рассмотрим пример:

class C feature ... end class COMPOSITE2 feature x: C y: expanded C reattach is do x := y end end

При вызове компонента reattach в результате присваивания x будет присоединен к объекту, являющемуся клоном объекта y.

Следующая таблица обобщает семантику присоединения изученных случаев:

Таблица 8.1. Эффект присоединения x:=y

Тип цели xТип источника yСсылочныйРазвернутый
СсылочныйСсылочное присоединениеКлонирование: эффект x := clone(y)
РазвернутыйКопирование: эффект x.copy(y) Ошибка, если y - voidКопирование: эффект x.copy(y)



Содержание раздела