|
В некоторых случаях возникает необходимость в написании подпрограмм, которые выполняют одинаковые логические действия, но над переменными разных типов данных. В языке 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 отвечает на типовые вопросы выбора, рейтинг — на сравнение позиций. Это разные блоки одной страницы.