Перегрузка процедур (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 (Visual Basic) можно определить версии процедуры для каждого списка аргументов:
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)
Ссылки
Основные понятия
Вопросы, связанные с перегрузкой процедур (Visual Basic)