Перегрузка процедур (Visual Basic)

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

Правила перегрузки

При перегрузке процедуры применяются следующие правила:

  • То же имя. Каждая перегруженная версия должна использовать то же имя процедуры.

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

    • Количество параметров

    • Порядок параметров

    • Типы данных параметров

    • Число параметров типа (для универсальной процедуры)

    • Тип возвращаемого значения (только для оператора преобразования)

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

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

    • Модификатор процедур ключевое слово, например Public, SharedиStatic

    • Имена параметров параметра или типа

    • Ограничения параметров типа (для универсальной процедуры)

    • Модификатор параметров ключевое слово, например ByRef иOptional

    • Возвращается ли значение

    • Тип данных возвращаемого значения (за исключением оператора преобразования)

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

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

Несколько версий процедуры

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

Sub postName(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Sub postAcct(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

Перегруженные версии

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

Overloads Sub post(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Overloads Sub post(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

Дополнительные перегрузки

Если вы также хотите принять сумму транзакции в любом Decimal или Single, можно дополнительно перегрузить post , чтобы разрешить этот вариант. Если вы сделали это для каждой перегрузки в предыдущем примере, у вас будет четыре Sub процедуры с одинаковым именем, но с четырьмя разными сигнатурами.

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

Преимущество перегрузки процедуры заключается в гибкости вызова. Чтобы использовать процедуру post , объявленную в предыдущем примере, вызывающий код может получить идентификацию клиента как a String или an Integer, а затем вызвать ту же процедуру в любом случае. Проиллюстрируем это на примере.

Imports MSVB = Microsoft.VisualBasic
Dim customer As String
Dim accountNum As Integer
Dim amount As Single
customer = MSVB.Interaction.InputBox("Enter customer name or number")
amount = MSVB.Interaction.InputBox("Enter transaction amount")
Try
    accountNum = CInt(customer)
    Call post(accountNum, amount)
Catch
    Call post(customer, amount)
End Try

См. также