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


Перегрузка процедур

Обновлен: Ноябрь 2007

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

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

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

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

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

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

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

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

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

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

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

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

    • Ключевые слова модификаторов процедур, например 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 можно определить версии процедуры для каждого списка аргументов:

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, объявленную в предыдущем примере, вызывающий код должен получить идентификатор клиента типа String или 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

См. также

Задачи

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

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

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

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

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

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

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

Разрешение перегрузки

Универсальные типы в Visual Basic

Ссылки

Overloads