В некоторых случаях возникает необходимость в написании подпрограмм, которые выполняют одинаковые логические действия, но над переменными разных типов данных. В языке Delphi существует возможность дать двум и более процедурам (функциям) одинаковые идентификаторы при условии, что все такие процедуры (функции) отличаются списком параметров. Такая возможность называется перегрузкой. Для указания того, что процедура (функция) перегружена, служит стандартная директива overload: procedure Increment(var Value: Integer); overload; procedure Increment(var Value: Real); overload; Какую именно процедуру использовать в том или ином случае компилятор будет определять на этапе компиляции программы по типам фактических аргументов, передаваемых при вызове. При перегрузке процедур и функций существует особенность, связанная с целочисленными типами данных. Допустим, имеются две процедуры: procedure Print(X: Shortint); overload; // процедура 1 procedure Print(X: Longint); overload; // процедура 2 Если мы попробуем вызвать процедуру Print, указав в качестве фактического аргумента целочисленную константу, то увидим, что выбор компилятором варианта процедуры зависит от значения константы. Поскольку в нынешней версии среды Delphi обобщенный тип данных Integer совпадает с фундаментальным типом данных Longint, следующий вариант перегрузки является ошибочным: procedure Print(X: Integer); overload; procedure Print(X: Longint); overload; // Ошибка! Такая же ошибка возникает при использовании пользовательских типов данных, определенных через общий базовый тип. type
TMyInteger = Integer;
procedure Print(X: Integer); overload;
procedure Print(X: TMyInteger); overload; // Ошибка!
Что делать в тех случаях, когда такая перегрузка просто необходима? Для этого пользовательский тип данных необходимо создавать с использованием ключевого слова type: type
TMyInteger = type Integer;
procedure Print(X: Integer); overload;
procedure Print(X: TMyInteger); overload; // Правильно
Перегруженные процедуры и функции должны иметь одинаковое колчиество передаваемых переменных. Запрещается также перегружать функции, которые отличаются лишь типом возвращаемого значения. function SquareRoot(X: Integer): Single; overload; function SquareRoot(X: Integer): Double; overload; // Ошибка! |