Перегрузка имен подпрограмм
Перегрузка имен подпрограмм
В одном пространстве имен может быть определено несколько процедур или функций с одним именем, но разным количеством или типами параметров. Имена таких процедур и функций называются перегруженными, а их создание - перегрузкой имен. Разновидностью перегрузки имен является перегрузка операций.
При вызове перегруженной процедуры или функции выбирается та версия, у которой типы формальных параметров совпадают с типами фактических или наиболее близки к ним. Например, если имеются описания
procedure p(b: byte);
begin
end;
procedure p(r: real);
begin
end;
то при вызове p(1.0) будет выбрана перегруженная версия с параметром типа real (точное соответствие), а при вызове p(1) будет выбрана перегруженная версия с параметром типа byte (при этом произойдет преобразование фактического параметра типа integer к типу byte).
Заметим, что, в отличие от Object Pascal, использовать при перегрузке служебное слово overload не нужно.
Если ни одна версия в текущем пространстве имен не подходит к данному вызову, то возникает ошибка компиляции. Если две и более версии одинаково хорошо подходят к данному вызову, то также возникает ошибка компиляции, заключающаяся в неоднозначности выбора подпрограммы. Например, если имеются описания
procedure p(i: integer; r: real);
begin
end;
procedure p(r: real; i: integer);
begin
end;
то при вызове p(1,2) оба они одинаково подходят, что приводит к неоднозначности.
Запрещено перегружать подпрограмму другой подпрограммой с тем же количеством и типами параметров, отличающихся лишь тем, передается ли параметр по значению или по ссылке. Например, описания
procedure p(i: integer);
и
procedure p(var i: integer);
считаются одинаковыми.
Возвращаемое значение функции не участвует в разрешении перегрузки, т.е. перегружаемые функции не могут различаться только типами возвращаемых значений.
Алгоритм перегрузки имен при наличии нескольких подключенных модулей, а также алгоритм перегрузки имен методов имеют особенности. Основная особенность этих алгоритмов состоит в том, что они работают через границы пространств имен.
Поиск перегруженного имени глобальной подпрограммы при наличии нескольких подключенных модулей происходит во всех модулях. При этом вначале осуществляется просмотр текущего модуля, а потом всех модулей, подключенных в секции uses, в порядке справа налево. Если при этом поиске находится объект, который не может перегружать предыдущие (например, перегружается процедура, а найдено имя переменной), то цепочка перегрузки заканчивается, и поиск наилучшей перегруженной подпрограммы идет среди найденных до этого момента. Если в модуле, откомпилированном позже, имеется подпрограмма с точно такими же параметрами, то она скрывает версию из модуля, откомпилированного раньше.
Например, пусть основная программа подключает два модуля - un1 и un2:
main.pas
uses un2,un1;
procedure p(i: integer);
begin
write(1);
end;
begin
p(2.2);
p(2);
end.
un2.pas
unit un2;
procedure p(r: real);
begin
write(3);
end;
end.
un1.pas
unit un1;
procedure p(r: real);
begin
write(2);
end;
end.
В результате будет выведено 21, что означает, что первой была вызвана процедура p из модуля un1.
Поиск перегруженного имени метода осуществляется аналогично: вначале осуществляется просмотр текущего класса, затем его базового класса и т.д. до класса Object, либо до того момента, как будет встречен объект, который не может перегружать предыдущие (имя поля или свойства). Из всех найденных таким образом одноименных методов выбирается наилучший. При этом в разных классах могут быть методы с идентичными параметрами; в этом случае вызывается первый встреченный метод от данного класса к классу Object.
Подпрограммы с переменным числом параметров также участвуют в перегрузке, однако, обычные подпрограммы имеют над ними приоритет. Например, в ситуации
procedure p(i: integer);
begin
write(1);
end;
procedure p(params a: array of integer);
begin
write(2);
end;
begin
p(1)
end.
будет вызвана первая процедура.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
1. Параметры подпрограмм
1. Параметры подпрограмм В описании процедуры или функции задается список формальных параметров. Каждый параметр, описанный в списке формальных параметров, является локальным по отношению к описываемой процедуре или функции, и в модуле, связанном с данной процедурой
2. Типы параметров подпрограмм
2. Типы параметров подпрограмм Параметры-значенияФормальный параметр-значение обрабатывается как локальная по отношению к процедуре или функции переменная, за исключением того, что он получает свое начальное значение из соответствующего фактического параметра при
46. Оптимизация переходов и вызовов подпрограмм
46. Оптимизация переходов и вызовов подпрограмм Программы, которые изобилуют ветвлениями и переходами во всех направлениях, нежелательны во всех смыслах, а в случае работы с процессорами серий 80 х 86 и 80 х 88 – особенно. Это является напутствием, цель которого – побудить
2.4. Предотвращение конфликта имен с помощью пространств имен
2.4. Предотвращение конфликта имен с помощью пространств имен ПроблемаВ несвязанных между собой модулях обнаружены конфликтующие имена или требуется заранее избежать возможности таких конфликтов, создав логические группы кода.РешениеДля структурирования кода
Создание пользовательских подпрограмм преобразования
Создание пользовательских подпрограмм преобразования В C# есть два ключевых слова, explicit и implicit, предназначенные для управления тем, как типы должны отвечать на попытки преобразования. Предположим, что у нас есть следующие определения структур.public struct Rectangle { // Открыты для
Определение подпрограмм неявного преобразования
Определение подпрограмм неявного преобразования До этого момента мы с вами создавали пользовательские операции явного преобразования. Но что можно сказать о следующем неявном преобразовании?static void Main(string[] args) { … // Попытка выполнить неявное преобразование? Square
5.5. Двоичная регистрация сохраненных подпрограмм и триггеров
5.5. Двоичная регистрация сохраненных подпрограмм и триггеров Двоичный файл регистрации содержит информацию относительно инструкций SQL, которые изменяют содержание базы данных. Эта информация сохранена в форме события. Это описывает модификации. Двоичный файл
Перегрузка имен функций
Перегрузка имен функций В соответствии с правилами языка С различные функции, определенные в программе, должны иметь разные имена. Это не всегда удобно, так как могут быть несколько функций, выполняющих сходные действия, но немного отличающиеся по набору параметров.Язык
4.6.7 Перегрузка Имен Функций
4.6.7 Перегрузка Имен Функций Как правило, давать разным функциям разные имена – мысль хорошая, но когда некоторые функции выполняют одинаковую рботу над объектами разных типов, может быть более удобно дать им одно и то же имя. Использование одного имени для различных
Ограничения на параметры обобщенных подпрограмм и классов
Ограничения на параметры обобщенных подпрограмм и классов По умолчанию с переменными, имеющими тип параметра обобщенного класса или подпрограммы, внутри методов обобщённых классов и обобщенных подпрограмм можно делать лишь ограниченный набор действий: присваивать и
Группирование Подпрограмм (Routine Grouping)
Группирование Подпрограмм (Routine Grouping) Шаблон подпрограммы has, даже если его полностью детализировать и ввести параметризацию типа, все еще не будет пригоден в качестве повторно используемого компонента. Поиск в таблице зависит от того, как таблица создавалась, как в нее
Применение однократных подпрограмм
Применение однократных подпрограмм Понятие однократных подпрограмм расширяет круг задач, позволяя включить разделяемые объекты, глобальные системные параметры, инициализацию общих
8. Опережающие описания и подключение подпрограмм. Директива
8. Опережающие описания и подключение подпрограмм. Директива В программе может содержаться несколько подпрограмм, т. е. структура программы может быть усложнена. Однако эти подпрограммы могут располагаться на одном уровне вложенности, поэтому сначала должно идти
9. Параметры подпрограмм
9. Параметры подпрограмм В описании процедуры или функции задается список формальных параметров. Каждый параметр, описанный в списке формальных параметров, является локальным по отношению к описываемой процедуре или функции, и в модуле, связанным с данной процедурой
10. Типы параметров подпрограмм
10. Типы параметров подпрограмм Параметры-значенияФормальный параметр-значение обрабатывается как локальная переменная, он получает свое начальное значение из соответствующего фактического параметра при активизации процедуры или функции. Изменения, которые