Перегрузка процедуры означает определение процедуры в нескольких версиях, используя одно и то же имя, но разные списки параметров. Целью перегрузки является определение нескольких тесно связанных версий процедуры без необходимости различать их по имени. Это можно сделать, изменив список параметров.
При перегрузке процедуры применяются следующие правила:
То же имя. Каждая перегруженная версия должна использовать то же имя процедуры.
Другая подпись. Каждая перегруженная версия должна отличаться от всех других перегруженных версий по крайней мере в одном из следующих аспектов:
Вместе с именем процедуры предыдущие элементы коллективно называются сигнатурой процедуры. При вызове перегруженной процедуры компилятор использует подпись для проверки, что вызов правильно соответствует определению.
Элементы, не участвующие в подписи. Невозможно перегрузить процедуру без изменения подписи. В частности, нельзя перегружать процедуру, изменяя только один или несколько следующих элементов:
Ключевые слова модификатора процедуры, такие как Public
, Shared
и Static
Имена параметров или типовых параметров
Ограничения параметров типа (для универсальной процедуры)
Ключевые слова модификатора параметров, такие как ByRef
и Optional
Возвращается ли значение
Тип данных возвращаемого значения (за исключением оператора преобразования)
Элементы в предыдущем списке не являются частью подписи. Хотя их нельзя использовать для различения перегруженных версий, их можно различать между перегруженными версиями, которые правильно различаются по их подписям.
Late-Bound Аргументы. Если вы планируете передать переменную объекта с поздней привязкой в перегруженную версию, необходимо объявить соответствующий параметр как Object.
Несколько версий процедуры
Предположим, что вы пишете Sub
процедуру для публикации транзакции по балансу клиента, и вы хотите иметь возможность ссылаться на клиента по имени или по номеру счета. Для этого можно определить две различные Sub
процедуры, как показано в следующем примере:
Sub postName(ByVal custName As String, ByVal amount As Single)
End Sub
Sub postAcct(ByVal custAcct As Integer, ByVal amount As Single)
End Sub
Альтернативой является перегрузка имени одной процедуры. Ключевое слово "Перегрузки" можно использовать для определения версии процедуры для каждого списка параметров следующим образом:
Overloads Sub post(ByVal custName As String, ByVal amount As Single)
End Sub
Overloads Sub post(ByVal custAcct As Integer, ByVal amount As Single)
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