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 lub ByRef, 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

  1. Otwórz nowy projekt i dodaj klasę o nazwie TaxClass.

  2. 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
    
  3. 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
    
  4. Dodaj przycisk do formularza i wywołaj ShowTax procedurę ze Button1_Click zdarzenia przycisku.

  5. 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".

Zobacz też