13.4. Присваивание объектов

Из «умения» объектов наследовать вытекают новые правила присваивания для переменных типа «объект» (экземпляров). Им можно присваивать не только значения этого же типа, но и любого производного от него. Аналогичное правило совместимости типов действует при передаче в процедуру или функцию параметров типа «объект». Например, если в программе объявлены переменные типа «объект»:

VAR

ObjPosVar : ObjPos; { переменная - позиция в тексте }

ObjSymVar : ObjSym; { переменная - символ в позиции }

то для копирования позиции, записанной в ObjSymVar, в переменную ObjPosVar достаточно выполнить присваивание

ObjPosVar := ObjSymVar;

Подобная операция заполнит поля данных в ObjPosVar значениями аналогичных полей, унаследованных ObjSymVar. Методы таким способом не присваиваются. Поскольку производный тип всегда получается не меньшим, чем прародительский, операция Присваивания возможна именно таким путем:

Прародитель <-- Наследник.

При этом гарантируется заполнение всех полей переменной, стоящей слева. В противном случае возникла бы неопределенность с «лишними» полями, присутствующими в переменной справа. Во избежание такой неопределенности запрещено ставить «наследный» тип слева от прародительского.

Переменные типа «объект» могут быть динамическими, т.е. объявляться как ссылки:

VAR

ObjPosVarPtr : ^ObjPos; { ссылка на позицию в тексте }

ObjSymVarPtr : ^ObjSym; { ссылка на символ в позиции }

После создания динамических объектов процедурой или функцией New ссылки (как разыменованные, так и сами по себе) могут присваиваться друг другу. Правила совместимости останутся теми же: корректными будут только присваивания ссылок на наследников ссылкам на прародителей:

- 280 -

ObjPosVarPtr := ObjSymVarPtr; { передача ссылки }

ObjPosVarPtr^ := ObjSymVarPtr^; { передача полей }