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


Аспекты в процедурах перегрузки (Visual Basic)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Перегрузки и массивы параметров

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

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

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

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

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

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

Когда использовать массив параметров

Вы будете лучше обеспечены параметром 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)

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

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

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

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

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

См. также