К содержанию

Перегрузка процедур и функций

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

В языке 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; // Ошибка!

Добавить комментарий

Частые вопросы

Как часто обновляются данные по теме «Перегрузка процедур и функций»?

Страница пересматривается, когда меняются публичные условия, состав линейки или появляются устойчивые жалобы пользователей. Дата в карточке и в карте сайта меняется только после правки текста.

Нужна ли регистрация, чтобы пользоваться материалами Языки программирования Pascal и Delphi?

Нет. Все обзоры, таблицы и FAQ открыты. Формы заявок, если встречаются, ведут на сайты компаний и не являются частью этого проекта.

Где смотреть источники и контакты редакции Языки программирования Pascal и Delphi?

Автор указан в карточке страницы. Служебные разделы — «О проекте», «Контакты» и политика конфиденциальности — в подвале сайта.

Есть ли смысл читать FAQ, если уже есть рейтинг?

Да. FAQ отвечает на типовые вопросы выбора, рейтинг — на сравнение позиций. Это разные блоки одной страницы.