Перегрузка методов
Есть еще одна, совершенно особенная разновидность методов – перегружаемые.
Эту категорию методов нельзя назвать антагонистом двух предыдущих: и статические, и виртуальные, и динамические методы могут быть перегружаемыми. Перегрузка методов нужна, чтобы произвести одинаковые или похожие действия с разнотипными данными.
Рассмотрим немного измененный пример, иллюстрирующий статические методы:
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, т. е. те, которые будут использоваться в Инспекторе объектов.