Поделиться через


Вопросы, связанные с перегрузкой процедур (Visual Basic)

При перегрузке процедур необходимо использовать отдельную сигнатуру для каждой из перегруженных версий.Это обычно означает, что для каждой версии должен быть задан отдельный список параметров.Дополнительные сведения см. в разделе "Другие сигнатуры" в Перегрузка процедур (Visual Basic).

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

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

Альтернативы перегруженных версий

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

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

e18yd02w.collapse_all(ru-ru,VS.110).gifПерегрузки и необязательные аргументы

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

e18yd02w.collapse_all(ru-ru,VS.110).gifКогда следует использовать перегруженные версии

Можно определять наборы перегруженных версий в следующих случаях:

  • Логика в коде процедуры существенно отличается в зависимости от того, предоставляет ли вызывающий код дополнительный аргумент или нет.

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

e18yd02w.collapse_all(ru-ru,VS.110).gifКогда следует использовать дополнительные параметры

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

  • Единственное действие, которое необходимо выполнить, когда вызывающий код не предоставляет дополнительный аргумент — это установить для параметра значение по умолчанию.В таком случае код процедуры можно упростить, если определить одну версию с одним или несколькими параметрами Optional.

Дополнительные сведения см. в разделе Необязательные параметры (Visual Basic).

e18yd02w.collapse_all(ru-ru,VS.110).gifПерегрузки и массивы параметров

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

e18yd02w.collapse_all(ru-ru,VS.110).gifКогда следует использовать перегруженные версии

Можно определять наборы перегруженных версий в следующих случаях:

  • Известно, что вызывающий код передает в массив параметров только небольшое количество значений.

  • Логика в коде процедуры значительно отличается в зависимости от количества значений, которые передает вызывающий код.

  • Вызывающий код может передавать значения различных типов данных.

e18yd02w.collapse_all(ru-ru,VS.110).gifКогда следует использовать массив параметров

Параметр ParamArray рекомендуется использовать в следующих случаях:

  • Невозможно предсказать количество значений, которые вызывающий код может передать в массив параметров; оно может быть большим числом.

  • Логика процедуры предоставляет саму себя для итерации по всем значениям, которые предает вызовающий код, выполняя фактически одинаковые операции над каждым значением.

Дополнительные сведения см. в разделе Массивы параметров (Visual Basic).

Неявные перегрузки для дополнительных параметров

Процедура с параметром 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 (Visual Basic) как процедуру с бесконечным числом перегрузок, отличающихся друг от друга тем, что именно передает вызывающий код в массив параметров:

  • Одна перегрузка, когда вызывающий код не передает аргумент в 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)

Программирование без типов как альтернатива перегрузке

Если нужно разрешить вызывающему коду передавать различным типам данных на параметр, то альтернативный подход программирование без типов.Можно отключить проверку типов, установив значение Off, используя параметр компилятора Оператор Option Strict или /optionstrict.В этом случае нет необходимости объявлять тип данных параметра.Однако у такого подхода есть ряд недостатков по сравнению с перегрузкой:

  • Код, получающийся в результате программирования без типов, выполняется менее эффективно.

  • Процедура должна проверять каждый тип данных, который может быть ей передан.

  • Компилятор не может сообщить об ошибке, если вызывающий код передает тип данных, не поддерживаемый процедурой.

См. также

Задачи

Устранение неполадок в процедурах (Visual Basic)

Практическое руководство. Определение различных версий процедуры (Visual Basic)

Практическое руководство. Вызов перегруженной процедуры (Visual Basic)

Практическое руководство. Перегрузка процедуры, которая принимает один необязательный параметр (Visual Basic)

Практическое руководство. Перегрузка процедуры, принимающей неопределенное число параметров (Visual Basic)

Ссылки

Overloads (Visual Basic)

Основные понятия

Процедуры в Visual Basic

Параметры и аргументы процедуры (Visual Basic)

Разрешение перегрузки (Visual Basic)