14.10.10 overload

На верх  Назад  Вперёд

Модификатор overload сообщает компилятору, что функция перегружена. Он используется для совместимости с Delphi, и для Free Pascal, все функции и процедуры могут быть перегружены без этого модификатора.

Существует только один случай, когда модификатор overload является обязательным: если функция должна быть перегружена, и находится в другом модуле. Обе функции должны быть объявлены с модификатором overload: модификатор overload говорит компилятору, что он должен продолжать искать перегруженные версий функций в других модулях.

Следующий пример это иллюстрирует. Возьмем первый модуль:

unit ua;

 

interface

 

procedure DoIt(A : String); overload;

 

implementation

 

procedure DoIt(A : String);

begin

Writeln('ua.DoIt получил ',A)

end;

 

end.

И второй модуль, содержит перегруженную версию:

unit ub;

 

interface

 

procedure DoIt(A : Integer); overload;

 

implementation

 

procedure DoIt(A : integer);

 

begin

Writeln('ub.DoIt получил ',A)

end;

 

end.

Следующая программа использует оба модуля:

program uab;

 

uses ua,ub;

 

begin

DoIt('Некоторая строка');

end.

Когда компилятор ищет объявление DoIt, он начнёт с модуля ub. Без директивы overload, компилятор выдаст ошибку несоответствие типа аргумента:

home: >fpc uab.pp

uab.pp(6,21) Error: Incompatible type for arg no. 1:

Got "Constant String", expected "SmallInt"

 

home: >fpc uab.pp

uab.pp(6,21) Ошибка: Несовместимый тип аргумента номер. 1:

Получила "Строковую константу", ожидая "SmallInt"

Директивы overload (в обоих месте местах), говорят компилятору, что нужно продолжать поиски перегруженной версии функций для согласования списка параметров. Обратите внимание, что оба описания должны иметь модификатор overload; недостаточно иметь модификатор только в модуле ub. Это делается для предотвращения нежелательной перегрузки: программист, который реализовал модуль ua, должен объявить процедуру, как перегружаемую.