- •Составление программ с использованиемобъектно-ориентированного подхода
- •Теоретические сведения
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Виртуальные методы
- •Конструкторы
- •Присваивание объектов
- •Пример программирования с использованием объектных типов
- •Лабораторное задание
- •Порядок выполнения лабораторной работы
- •Требования к отчету
- •Контрольные вопросы
Присваивание объектов
Между экземплярами одного и того же объектного типа возможен обмен информацией с помощью оператора присваивания. Например, если Р1 и Р2 - экземпляры объектного типа TPoints, то допустимы присваивания:
Р1:=Р2
или
Р2:=Р1
Присваивания разрешены и между экземплярами родственных объектных типов, однако в этом случае экземпляру прародителя можно присвоить значение экземпляра любого из его потомков, т.к. потомки посредством наследования содержат все поля данных, которые имеют их прародители. Наоборот, присвоение значения прародителя потомку может привести к тому, что новые поля потомка останутся неопределёнными, что недопустимо.
В операторе присваивания только те поля данных, которые являются общими для обоих типов, будут скопированы от источника к приёмнику. Методы таким способом не копируются. Например, если в программе объявлены переменные
Var
P:TPoints;
C:TCircle;
и созданы экземпляры точки и окружности операторами
P:=TPoints.Create;
C:=TCircle.Create;
причём объектный тип TCircle является потомком объектного типа TPoints, то разрешается присваивание
Р:=С
Этот оператор заполнит поля данных X, Y и Visible экземпляра Р значениями соответствующих полей экземпляра С, при этом заполнение всех полей экземпляра P гарантировано.
Обратное присваивание
С:=Р
недопустимо, так как возникает неопределённость с полем Radius экземпляра С.
Также следует иметь в виду, что присваивание не заменяет обращения к конструктору. При присваивании копируются только поля данных объекта, а адрес таблицы VMT не копируется.
Аналогичное правило совместимости типов действует при передаче в процедуру или функцию параметра объектного типа. Формальному параметру объектного типа может соответствовать фактический параметр не только этого же типа, но и типа, производного от него.
В качестве примера вернёмся к программе на рис.11, которая сначала перемещает по экрану точку, затем аналогичным образом перемещает по экрану окружность. Давайте напишем процедуру, которая будет перемещать по экрану любую из этих фигур (рис.17). Формальным параметром такой процедуры следует объявить переменную типа TPoints; тогда в качестве фактического параметра можно будет использовать не только экземпляр типа TPoints, но и экземпляр - потомок типа TCircle.
+--------------------------------------------------------------+
¦ Procedure AnyMove (Any:TPoints); ¦
¦ Begin ¦
¦ With Any Do ¦
¦ Begin ¦
¦ Show; ¦
¦ While GetY<=150 Do Move(10,10); ¦
¦ Hide ¦
¦ End; ¦
¦ End; ¦
+--------------------------------------------------------------+
Рис.17
С использованием этой процедуры раздел операторов программы будет выглядеть следующим образом:
BEGIN
...
P.Init(50,50);
AnyMove(P);
C.Init(50,50);
AnyMove(C);
...
END.
Работать такая программа будет правильно, так как все методы, вызываемые внутри процедуры AnyMove, являются виртуальными.