Перегруженные свойства и методы
Обновлен: Ноябрь 2007
Перегрузка — это создание более чем одной процедуры, конструктора экземпляра или свойства в классе с одинаковыми именами, но с различными типами аргументов.
Использование перегрузки
Перегрузка особенно полезна, когда в объектной модели нужно использовать одинаковые имена процедур, работающих с различными типами данных. Например класс, в котором отображаются несколько различных типов данных, может иметь процедуры Display, которые выглядят следующим образом:
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Overloads Sub Display(ByVal theDouble As Double)
' Add code that displays Double data.
End Sub
Без использования перегрузки возникает необходимость создания процедур с разными именами, даже если они выполняют одни и те же действия. См. следующий пример.
Sub DisplayChar(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Sub DisplayInt(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Sub DisplayDouble(ByVal theDouble As Double)
' Add code that displays Double data.
End Sub
Перегрузка облегчает использование свойств или методов, поскольку позволяет выбирать типы используемых данных. Например перегруженный метод Display, описанный ранее может быть вызван любой из следующих строк кода:
' Call Display with a literal of type Char.
Display("9"c)
' Call Display with a literal of type Integer.
Display(9)
' Call Display with a literal of type Double.
Display(9.9R)
Во время выполнения Visual Basic вызывает нужную процедуру на основании заданных пользователем параметров типов данных.
Примечание. |
---|
Перегрузка, переопределение и переобъявление являются схожими понятиями, которые легко перепутать. Дополнительные сведения см. в разделе Знакомство с объектами в Visual Basic. |
Правила перегрузки
Перегруженный элемент класса создается путем добавления двух или более свойств или методов с тем же именем. За исключением перегруженных унаследованных элементов, все перегруженные элементы должны иметь разные списки параметров. При перегрузке свойства или процедуры следующие элементы не могут быть использованы как средства определения.
Модификаторы, такие как ByVal или ByRef, которые применимы к элементу, или параметрам элемента.
Имена параметров
Возвращаемые типы процедур
Ключевое слово Overloads не обязательно при перегрузке, но, если некоторый перегруженный элемент использует ключевое слово Overloads, то все остальные перегруженные элементы с этим же именем также должны быть определены этим ключевым словом.
Производные классы могут перегружать унаследованные элементы с элементами, имеющими идентичные параметры и типы параметров. Этот процесс называется перекрытие по имени и подписи. Если ключевое слово Overloads используется при перекрытие по имени и подписи, то будет использоваться реализация элемента в порожденном классе вместо реализации в базовом классе, и все другие перегрузки этого элемента будут доступны для экземпляров производного класса.
Если ключевое слово Overloads пропущено при перегрузке унаследованного элемента элементом, имеющим одинаковые параметры и типы параметров, тогда перегрузка называется перекрытие по имени. Перекрытие по имени заменяет унаследованную реализацию элемента и делает все остальные перегрузки недоступными для экземпляров производного класса и его потомков.
Модификаторы Overloads и Shadows не могут использоваться одновременно с одним свойством или методом.
Пример
В следующем примере создаются перегруженные методы, поддерживающие представление суммы в долларах типа String или Decimal и возвращающие строку, содержащую налог с продаж.
Чтобы использовать этот пример для создания перегруженного метода выполните следующие действия
Откройте новый проект и добавьте класс с именем TaxClass.
Добавьте в класс TaxClass следующий код.
Public Class TaxClass Overloads Function TaxAmount(ByVal decPrice As Decimal, _ ByVal TaxRate As Single) As String TaxAmount = "Price is a Decimal. Tax is $" & _ (CStr(decPrice * TaxRate)) End Function Overloads Function TaxAmount(ByVal strPrice As String, _ ByVal TaxRate As Single) As String TaxAmount = "Price is a String. Tax is $" & _ CStr((CDec(strPrice) * TaxRate)) End Function End Class
Добавьте в форму следующую процедуру.
Sub ShowTax() ' 8% tax rate. Const TaxRate As Single = 0.08 ' $64.00 Purchase as a String. Dim strPrice As String = "64.00" ' $64.00 Purchase as a Decimal. Dim decPrice As Decimal = 64 Dim aclass As New TaxClass 'Call the same method with two different kinds of data. MsgBox(aclass.TaxAmount(strPrice, TaxRate)) MsgBox(aclass.TaxAmount(decPrice, TaxRate)) End Sub
Добавьте кнопку на форму и вызовите процедуру ShowTax из события Button1_Click кнопки.
Запустите проект и нажмите кнопку на форме, чтобы проверить перегруженную процедуру ShowTax.
Во время выполнения компилятор выбирает подходящую перегруженную функцию, соответствующую используемым параметрам. При нажатии кнопки, перегруженный метод вызывается сначала с параметром Price, который является строкой, и сообщением "Price is a String. Налог — $ 5,12". TaxAmount вызывается со значением Decimal во второй раз и выводится сообщение "Price is Decimal. Налог — $ 5,12".
См. также
Основные понятия
Знакомство с объектами в Visual Basic
Переопределение свойств и методов