Перегрузка методов
Есть еще одна, совершенно особенная
разновидность методов — перегружаемые.
Эту категорию методов нельзя назвать
антагонистом двух предыдущих: и статические, и виртуальные,
и динамические методы могут быть перегружаемыми. Перегрузка
методов нужна, чтобы произвести одинаковые или похожие
действия с разнотипными данными.
Рассмотрим немного измененный пример,
иллюстрирующий статические методы:
type
TlstObj = class
FExtData : Extended;
procedure SetData(AValue:
Extended);
end; T2ndObj = class(TlstObj)
FIntData : Integer;
procedure SetData(AValue:
Integer); end;
var Tl: TlstObj;
T2 : T2ndObj;
В этом случае попытка вызова из объекта
Т2 методов
...
Т2.SetData (1.0);
Т2.SetData(1);
...
вызовет ошибку компиляции на первой
из двух строк. Для компилятора внутри Т2 статический
метод с параметром типа 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, для данных с плавающей точкой
— метод объекта Tistobj.
Можно перегрузить и виртуальный (динамический)
метод. Надо только в этом случае добавить директиву
reintroduce:
type
TlstObj = class
FExtData : Extended;
procedure SetData(AValue:
Extended); overload; virtual;
end;
T2ndObj = class(TlstObj)
FIntData : Integer;
procedure SetData(AValue:
Integer); reintroduce; overload;
end;
На перегрузку методов накладывается
ограничение — нельзя перегружать методы, находящиеся
в области видимости published,
т. е. те, которые будут использоваться в Инспекторе
объектов.
|