Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Совместимость объектов



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

На рис. 10 представлены классы, образующие иерархию. Один из классов — Класс А — является родительским для всех остальных. Соответственно, если некоторая переменная описана как ссылка на экземпляр Класс А, то на самом деле она может указывать еще и на Класс Б, и на Класс В.

Как и все объектно-ориентированные языки программирования, Delphi поддерживает свойство полиморфизма объектов при наследовании, которое состоит в правильном выборе виртуального метода, вызываемого из переменной-ссылки на объект. Вне зависимости от того, на экземпляр какого класса указывает переменная-ссылка в соответствии со своим описанием, будет вызван виртуальный метод, описанный в классе, на который реально указывает ссылка, а не его версия, описанная в классе, сопоставленном типу ссылочной переменной.


Рассмотрим (листинг 3.16), например, классы TLine и TCircle, являющиеся наследниками класса TGeomFugure и переопределяющие виртуальный метод Draw, чтобы придать ему функциональность, необходимую для вывода каждой конкретной геометрической фигуры. Опишем переменную, которая является ссылкой на экземпляр класса TGeomFigure и присвоим ей ссылку на экземпляр класса TLine.

Такая операция возможна, так как класс TLine является наследником класса TGeomFigure. При вызове метода Draw данной переменной этот метод будет вызван в том виде, как он описан в классе TLine, а не в классе TGeomFigure. В этом и выражается полиморфизм (многоформность) объектов, находящихся в одной иерархии.

Свойство полиморфизма поддерживается с помощью, так называемого позднего связывания (происходящего во время выполнения программы) переменных-экземпляров с методами, в отличие от раннего связывания (на этапе компиляции).

Листинг 3.16. Иллюстрация полиморфизма

Unit PolymorphObjects;

Interface

Type

TGeomFigure = class

Procedure Draw; virtual;

End; {Описание класса TGeomFigure с виртуальным методом Draw}

TLine = class

Procedure Draw; override;

End; {Описание класса TLine с переопределенным методом Draw}

Implementation

Procedure TGeomFigure.Draw;

Begin {Описание метода Draw класса TGeomFigure, метод ничего не}

end; {делает}

Procedure TLine.Draw;

Begin {Описание метода Draw класса TLine, метод выводит линию}

{Вывод линии}

end;

Procedure DsingPolymorph; {Описание процедуры, использующей

полиморфизм объектов}

Var

GeomFigure: TGeomFigure;

{Описание переменной-ссылки на экземпляр

класса TGeomFigure}

begin

GeomFigure:= TLine.Create;

{Создание экземпляра класса TLine и занесение ссылки на

него в переменную-ссылку на экземпляр класса TGeomFigure}

GeomFigure.Draw;

{Вызов метода Draw из переменной GeomFigure, реально

вызываемый метод описан в классе TLine (рисование линии) }

GeomFigure.Free;

{Разрушение объекта, на который указывает переменная

GeomFigure, если бы класс TLine переопределял деструктор,

то был бы вызван деструктор, описанный в классе TLine}

end;

End.





Дата публикования: 2014-11-02; Прочитано: 411 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...