Skip to Content

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

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

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

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

  1. type
  2.  
  3. TlstObj = class
  4.  
  5. FExtData : Extended;
  6.  
  7. procedure SetData(AValue: Extended);
  8.  
  9. end; T2ndObj = class(TlstObj)
  10.  
  11. FIntData : Integer;
  12.  
  13. procedure SetData(AValue: Integer); end;
  14.  
  15. var Tl: TlstObj;
  16.  
  17. T2 : T2ndObj;
  18.  
  19. В этом случае попытка вызова из объекта Т2 методов
  20.  
  21. ...
  22.  
  23. Т2.SetData (1.0);
  24.  
  25. Т2.SetData(1);
  26.  
  27. ...

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

  1. type
  2.  
  3. TlstObj = class
  4.  
  5. FExtData : Extended;
  6.  
  7. procedure SetData(AValue: Extended);overload;
  8.  
  9. end;
  10.  
  11. T2ndObj = class(TlstObj)
  12.  
  13. FIntData : Integer;
  14.  
  15. procedure SetData(AValue: Integer); overload;
  16.  
  17. end;

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

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

  1. type
  2.  
  3. TlstObj = class
  4.  
  5. FExtData : Extended;
  6.  
  7. procedure SetData(AValue: Extended); overload; virtual;
  8.  
  9. end;
  10.  
  11. T2ndObj = class(TlstObj)
  12.  
  13. FIntData : Integer;
  14.  
  15. procedure SetData(AValue: Integer); reintroduce; overload;
  16.  
  17. end;

На перегрузку методов накладывается ограничение — нельзя перегружать методы, находящиеся в области видимости published, т. е. те, которые будут использоваться в Инспекторе объектов.



Delphi Для профессионалов &1   |    Delphi Для профессионалов &2   |    Delphi Для профессионалов &3   |    Иллюстрированный самоучитель &1   |    Иллюстрированный самоучитель &2