Вопросы, связанные с перегрузкой процедур
Обновлен: Ноябрь 2007
При перегрузке процедур необходимо использовать отдельную подпись для каждой из перегруженных версий. Это обычно означает, что для каждой версии должен быть задан отдельный список параметров. Дополнительные сведения см. в разделе "Другие подписи" в Перегрузка процедур.
Процедура Function может быть перегружена процедурой Sub и наоборот, если они имеют разные подписи. Две перегрузки не отличаются только тем, что одна имеет возвращаемое значение, а другая нет.
Свойство может быть перегружено таким же образом, каким перегружается процедура, и с тем же ограничениями. Однако нельзя перегрузить процедуру свойством или свойство процедурой.
Альтернативы перегруженных версий
Иногда существуют альтернативы перегруженных версий, особенно если наличие аргументов является необязательным или их количество может меняться.
Следует учитывать, что необязательные аргументы могут не поддерживаться всеми языками, а массивы параметров ограничены Visual Basic. При написании процедуры, которая вероятнее всего будет вызываться из кода, написанного на любом из нескольких различных языков, перегруженные версии предоставляют наибольшую гибкость.
Перегрузки и необязательные аргументы
Вызывающий код может при необходимости предоставить или пропустить один или несколько аргументов, поэтому можно определить несколько перегруженных версий или использовать дополнительные параметры.
Когда следует использовать перегруженные версии
Можно определять наборы перегруженных версий в следующих случаях:
Логика в коде процедуры существенно отличается в зависимости от того, предоставляет ли вызывающий код дополнительный аргумент или нет.
Код процедуры не может быть надежно проверен или вызывающий код имеет указанный необязательный аргумент. Это происходит в том случае, если вызывающий код не может предоставить ни одного значения и нет ни одного кандидата на значение по умолчанию.
Когда следует использовать дополнительные параметры
В следующих случаях может потребоваться использование одного или нескольких дополнительных параметров.
- Единственное действие, которое необходимо выполнить, когда вызывающий код не предоставляет дополнительный аргумент — это установить для параметра значение по умолчанию. В таком случае код процедуры можно упростить, если определить одну версию с одним или несколькими параметрами Optional.
Дополнительные сведения см. в разделе Необязательные параметры.
Перегрузки и массивы параметров
Если вызывающий код может передавать переменное число аргументов, можно определить несколько перегруженных версий или использовать массив параметров.
Когда следует использовать перегруженные версии
Можно определять наборы перегруженных версий в следующих случаях:
Известно, что вызывающий код передает в массив параметров только небольшое количество значений.
Логика в коде процедуры значительно отличается в зависимости от количества значений, которые передает вызывающий код.
Вызывающий код может передавать значения различных типов данных.
Когда следует использовать массив параметров
Параметр ParamArray рекомендуется использовать в следующих случаях:
Невозможно предсказать количество значений, которые вызывающий код может передать в массив параметров; оно может быть большим числом.
Логика процедуры предоставляет саму себя для итерации по всем значениям, которые предает вызовающий код, выполняя фактически одинаковые операции над каждым значением.
Дополнительные сведения см. в разделе Массивы параметров.
Неявные перегрузки для дополнительных параметров
Процедура с параметром Optional (Visual Basic) эквивалентна двум перегруженным процедурам, у одной из которых имеется дополнительный параметр, а у другой — нет. Невозможно перегрузить такую процедуру с помощью списка параметров, соответствующего любой из них. Это показано в следующих объявлениях:
Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)
' The preceding definition is equivalent to the following two overloads.
' Overloads Sub q(ByVal b As Byte)
' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
' Therefore, the following overload is not valid because the signature is already in use.
' Overloads Sub q(ByVal c As Byte, ByVal k As Long)
' The following overload uses a different signature and is valid.
Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)
Для процедуры с несколькими необязательными параметрами существует набор неявных перегрузок, получающихся по той же схеме, которая приведена в предыдущем примере.
Неявные перегрузки для параметра ParamArray
Компилятор рассматривает процедуру с параметром ParamArray как процедуру с бесконечным числом перегрузок, отличающихся друг от друга тем, что именно передает вызывающий код в массив параметров:
Одна перегрузка, когда вызывающий код не передает аргумент в ParamArray
Одна перегрузка, когда вызывающий код предоставляет одномерный массив типа элемента ParamArray
Одна перегрузка для каждого положительного целого числа, когда вызывающий код предоставляет количество аргументов, каждый из которых относится к типу элемента ParamArray
Эти неявные перегрузки иллюстрируются в следующем примере:
Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)
' The preceding definition is equivalent to the following overloads.
' Overloads Sub p(ByVal d As Date)
' Overloads Sub p(ByVal d As Date, ByVal c() As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char)
' And so on, with an additional Char argument in each successive overload.
Нельзя перегрузить процедуру с помощью списка параметров, который принимает одномерный массив в качестве массива параметров. Однако можно использовать описания других неявных перегрузок. Это показано в следующих объявлениях:
' The following overload is not valid because it takes an array for the parameter array.
' Overloads Sub p(ByVal x As Date, ByVal y() As Char)
' The following overload takes a single value for the parameter array and is valid.
Overloads Sub p(ByVal z As Date, ByVal w As Char)
Программирование без типов как альтернатива перегрузке
Если требуется разрешить вызывающему коду передачу различных типов данных в параметр, в качестве альтернативы можно использовать Программирование без типов в Visual Basic. Можно отключить проверку типов, установив значение Off, используя параметр компилятора Оператор Option Strict или /optionstrict. В этом случае нет необходимости объявлять тип данных параметра. Однако у такого подхода есть ряд недостатков по сравнению с перегрузкой:
Код, получающийся в результате программирования без типов, выполняется менее эффективно.
Процедура должна проверять каждый тип данных, который может быть ей передан.
Компилятор не может сообщить об ошибке, если вызывающий код передает тип данных, не поддерживаемый процедурой.
См. также
Задачи
Устранение неполадок в процедурах
Практическое руководство. Определение различных версий процедуры
Практическое руководство. Вызов перегруженной процедуры
Практическое руководство. Перегрузка процедуры, которая принимает один опциональный параметр
Практическое руководство. Перегрузка процедуры, принимающей неопределенное число параметров
Основные понятия
Параметры и аргументы процедуры