13.4. Присваивание объектов
Из «умения» объектов наследовать вытекают новые правила присваивания для переменных типа «объект» (экземпляров). Им можно присваивать не только значения этого же типа, но и любого производного от него. Аналогичное правило совместимости типов действует при передаче в процедуру или функцию параметров типа «объект». Например, если в программе объявлены переменные типа «объект»:
VAR
ObjPosVar : ObjPos; { переменная - позиция в тексте }
ObjSymVar : ObjSym; { переменная - символ в позиции }
то для копирования позиции, записанной в ObjSymVar, в переменную ObjPosVar достаточно выполнить присваивание
ObjPosVar := ObjSymVar;
Подобная операция заполнит поля данных в ObjPosVar значениями аналогичных полей, унаследованных ObjSymVar. Методы таким способом не присваиваются. Поскольку производный тип всегда получается не меньшим, чем прародительский, операция Присваивания возможна именно таким путем:
Прародитель <-- Наследник.
При этом гарантируется заполнение всех полей переменной, стоящей слева. В противном случае возникла бы неопределенность с «лишними» полями, присутствующими в переменной справа. Во избежание такой неопределенности запрещено ставить «наследный» тип слева от прародительского.
Переменные типа «объект» могут быть динамическими, т.е. объявляться как ссылки:
VAR
ObjPosVarPtr : ^ObjPos; { ссылка на позицию в тексте }
ObjSymVarPtr : ^ObjSym; { ссылка на символ в позиции }
После создания динамических объектов процедурой или функцией New ссылки (как разыменованные, так и сами по себе) могут присваиваться друг другу. Правила совместимости останутся теми же: корректными будут только присваивания ссылок на наследников ссылкам на прародителей:
- 280 -
ObjPosVarPtr := ObjSymVarPtr; { передача ссылки }
ObjPosVarPtr^ := ObjSymVarPtr^; { передача полей }