Для перекрытия и виртуальных, и динамических методов служит директива override, с помощью которой (и только с ней!) можно переопределять оба этих типа методов. Приведем пример:

type

TFirstClass = class FMyFieldl: Integer;
FMyField2: Longint;
procedure StatMethcd;
procedure VirtMethodl;
virtual;
procedure VirtMethod2;
virtual;
procedure DynaMethodl;
d/iTamic-procedure DynaMethod2;
dynamic-end;

TSecondClass = class(TMyObject)

procedure StatMethcd;
procedure VirtMethodl;
override;

procedure IynaMethodl; override; end; var

Objl: TFirstClass;
Ob j 2: TSecondClass;

Первый из методов в примере создается заново, остальные два - перекрываются. Попытка применить директиву override к статическому методу вызовет ошибку компиляции.

( Примечание )

Будьте внимательны: попытка перекрытия с директивой не override, а virtual или dynamic приведет на самом деле к созданию нового одноименного метода.

Перегрузка методов

Есть еще одна, совершенно особенная разновидность методов - перегружаемые.

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

Рассмотрим немного измененный пример, иллюстрирующий статические методы:

type

TlstObj = class

FExtData : Extended;
procedure SetData(AValue: Extended) ;
end;
T2nd0bj = class(TlstObj) FIntData : Integer;
procedure SetData(AValue: Integer) ;
end;
var Tl: TlstObj;
T2 : T2nd0bj;

В этом случае попытка вызова из объекта т2 методов

Т2.SetData(1.0);
Т2.SetData(1);

вызовет ошибку компиляции на первой из двух строк. Для компилятора внутри тг статический метод с параметром типа extended перекрыт, и он его "не признает". Где же выход из сложившегося положения? Переименовать ОДИН ИЗ методов, например создать SetlntegerData И SetExtendedData? Можно, но если методов не два, а, скажем, сто, моментально возникнет путаница. Сделать методы виртуальными? Нельзя, поскольку тип и количество параметров в одноименных виртуальных методах должны в точности совпадать. Теперь для этого существуют перегружаемые методы, объявляемые при помощи директивы overload:

type

TlstObj = class

FExtData : Extended;
procedure SetData(AValue: Extended);overload;
end;
T2ndObj = class(TlstObj) FIntData : Integer;
procedure SetData(AValue: Integer);
overload;
end;

Объявив метод SetData перегружаемым, в программе можно использовать обе его реализации одновременно. Это возможно потому, что компилятор определяет тип передаваемого параметра (целый или с плавающей точкой) и в зависимости от этого подставит вызов соответствующего метода: для целочисленных данных - метод объекта T2ndobj, для данных с плавающей точкой - метод объекта Tlstobj.

Можно перегрузить и виртуальный (динамический) метод. Надо только в этом случае добавить директиву reintroduce:

type

TlstObj = class

FExtData : Extended;
procedure SetData(AValue: Extended);
overload;
virtual;
end;

T2-ndObj = class (TlstObj)

FIntData : Integer;
procedure SetData(AValue: Integer);
reintroduce;
overload;
end;

⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Октябрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс