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


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

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

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

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

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

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

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

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

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

Использование перегруженных версий

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

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

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

Когда следует использовать необязательные параметры

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

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

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

Перегрузки и ParamArrays

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

Использование перегруженных версий

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

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

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

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

Использование массива параметров

Вы лучше обслуживаете ParamArray параметр в следующих случаях:

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

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

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

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

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

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)

Бестипное программирование в качестве альтернативы перегрузке

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

  • Безтипное программирование создает менее эффективный код выполнения.

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

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

См. также