Przeciążone właściwości i metody (Visual Basic)
Przeciążenie to tworzenie więcej niż jednej procedury, konstruktora wystąpienia lub właściwości w klasie o tej samej nazwie, ale różnych typach argumentów.
Przeciążanie użycia
Przeciążenie jest szczególnie przydatne, gdy model obiektów określa, że stosujesz identyczne nazwy procedur działających na różnych typach danych. Na przykład klasa, która może wyświetlać kilka różnych typów danych, może mieć Display
procedury, które wyglądają następująco:
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
Bez przeciążenia należy utworzyć odrębne nazwy dla każdej procedury, mimo że są one takie same, jak pokazano poniżej:
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
Przeciążenie ułatwia korzystanie z właściwości lub metod, ponieważ zapewnia wybór typów danych, których można użyć. Na przykład przeciążona metoda omówiona Display
wcześniej może być wywoływana przy użyciu dowolnego z następujących wierszy kodu:
' 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)
W czasie wykonywania program Visual Basic wywołuje prawidłową procedurę na podstawie typów danych podanych parametrów.
Przeciążanie reguł
Element członkowski przeciążony dla klasy można utworzyć, dodając co najmniej dwie właściwości lub metody o tej samej nazwie. Z wyjątkiem przeciążonych elementów pochodnych, każdy przeciążony element członkowski musi mieć różne listy parametrów, a następujące elementy nie mogą być używane jako funkcja różnicowania podczas przeciążania właściwości lub procedury:
Modyfikatory, takie jak
ByVal
lubByRef
, mają zastosowanie do elementu członkowskiego lub parametrów elementu członkowskiego.Nazwy parametrów
Zwracanie typów procedur
Słowo Overloads
kluczowe jest opcjonalne podczas przeciążenia, ale jeśli jakikolwiek przeciążony element członkowski używa Overloads
słowa kluczowego, wówczas wszystkie inne przeciążone elementy członkowskie o tej samej nazwie muszą również określać to słowo kluczowe.
Klasy pochodne mogą przeciążać dziedziczone składowe z elementami członkowskimi, które mają identyczne parametry i typy parametrów, proces znany jako cieniowanie według nazwy i podpisu. Overloads
Jeśli słowo kluczowe jest używane podczas cieniowania według nazwy i podpisu, implementacja klasy pochodnej składowej zostanie użyta zamiast implementacji w klasie bazowej, a wszystkie inne przeciążenia dla tego elementu członkowskiego będą dostępne dla wystąpień klasy pochodnej.
Overloads
Jeśli słowo kluczowe zostanie pominięte podczas przeciążenia dziedziczonego elementu członkowskiego z elementem członkowskim, który ma identyczne parametry i typy parametrów, przeciążenie jest nazywane cieniowaniem według nazwy. Cieniowanie według nazwy zastępuje dziedziczona implementacja elementu członkowskiego i sprawia, że wszystkie inne przeciążenia są niedostępne dla wystąpień klasy pochodnej i jego dekodów.
Modyfikatory Overloads
i Shadows
nie mogą być używane z tą samą właściwością lub metodą.
Przykład
Poniższy przykład tworzy przeciążone metody, które akceptują lub Decimal
reprezentację String
kwoty w dolarach i zwracają ciąg zawierający podatek od sprzedaży.
Aby użyć tego przykładu do utworzenia metody przeciążonej
Otwórz nowy projekt i dodaj klasę o nazwie
TaxClass
.Dodaj poniższy kod do klasy
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
Dodaj następującą procedurę do formularza.
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
Dodaj przycisk do formularza i wywołaj
ShowTax
procedurę zeButton1_Click
zdarzenia przycisku.Uruchom projekt i kliknij przycisk na formularzu, aby przetestować przeciążonej
ShowTax
procedury.
W czasie wykonywania kompilator wybiera odpowiednią przeciążona funkcję zgodną z używanymi parametrami. Po kliknięciu przycisku przeciążona metoda jest wywoływana jako pierwsza z parametrem Price
, który jest ciągiem i komunikatem "Cena jest ciągiem. Zostanie wyświetlony podatek o wartości 5,12 USD". TaxAmount
jest wywoływana z wartością Decimal
po raz drugi, a komunikat "Price is a Decimal( Cena jest dziesiętna). Zostanie wyświetlony podatek o wartości 5,12 USD".