logo
Программирование в среде Delphy / Программирование в среде Delphi

17.4. Методы, наследование и полиморфизм

Наследование означает, что при создании нового класса он наследует все поля, свойства и методы, определенные в родительском классе. В новом классе только добавляются новые поля, методы и свойства. Унаследованные от предка поля и методы доступны в дочернем классе, но с учетом областей видимости. Если имеет место совпадение имен, то говорят, что они перекрываются. В Delphi допускается только последовательное единичное наследование классов.

Методы подразделяются на 4 группы:

статические (Static),

виртуальные (Virtual),

динамические (Dynamic),

абстрактные (Abstract).

Адрес вызова статического метода определяется на этапе трансляции проекта, и вызов этих методов осуществляется быстрее всех остальных методов. Такие методы можно без ограничений перекрывать и даже менять список передаваемых параметров. По умолчанию методы объектов являются статическими.

Адреса виртуальных и динамических методов определяются во время выполнения программы и находятся в специальных таблицах: таблице виртуальных методов (VMT) и таблице динамических методов (DMT). В таблицу VMT включаются адреса всех определенных в данном классе виртуальных методов и всех наследуемых методов. В таблицу DMT включаются адреса динамических методов, определенных только в данном классе. Поэтому виртуальные методы вызываются быстрее динамических, но размеры таблиц VMT существенно больше таблиц DMT. Динамические методы позволяют экономить память, но их вызов осуществляется медленнее всех остальных методов, так как приходится для поиска адреса метода проходить по всем таблицам DMT родительских классов, пока не будет найден нужный динамический метод.

Для перекрытия виртуальных и динамических методов используется ключевое слово Override. Список параметров перекрываемых виртуальных и динамических методов не должен отличаться от списка параметров этих методов в родительском классе.

Абстрактные методы определяют только интерфейсную часть метода, такие методы нельзя использовать без перекрытия в дочерних классах, где должна находиться и реализация такого метода.

Рассмотрим следующий пример:

Type Tpoint=Class(Tobject)

Constructor Create;

Destructor Destroy;virtual;

X,y:Integer;

C:Tcolor;

Procedure Show;virtual;

End;

Tcircle=Class(Tpoint)

Constructor Create;

Destructor Destroy;override;

R:Integer;

Procedure Show;override;

End;

…………………………..

Var Point1:Tpoint;

Circle1:Tcircle;

Begin

Point1:=Tpoint.Create;

Circle1:=Tcircle.Create;

With Point1 do Begin

X:=100;y:=50; C:=clRed;

Show;

End;

With Circle1 do Begin

X:=200;Y:=100:C:=clBlue;

R:=50;

Show;

End;

…………………

В данном примере определены два класса: Tpoint и Tcircle. Класс Tpoint наследует класс Tobject. В классе Tpoint определены поля X, Y, которые задают точку на экране дисплея, и C – цвет этой точки. В нем также описаны методы по выделению и освобождению памяти под объект и виртуальный метод Show – рисования точки на экране. Класс Tcircle наследует класс Tpoint и все его поля и методы. В нем дополнительно описаны поле R (радиус) и метод Show, который перекрывает аналогичный метод класса Tpoint. Метод Show класса Tcircle рисует теперь окружность. В результате два метода Show рисуют разные картинки, в зависимости от того, какому классу они принадлежат. Это и называется полиморфизмом объектов.