Überladene Eigenschaften und Methoden (Visual Basic)

Unter Überladung versteht man die Erstellung mehrerer Prozeduren, Instanzkonstruktoren oder Eigenschaften in einer Klasse mit demselben Namen, aber unterschiedlichen Argumenttypen.

Nutzung der Überladung

Überladung ist besonders dann nützlich, wenn Ihr Objektmodell vorgibt, dass identische Namen für Prozeduren verwendet werden, die auf unterschiedlichen Datentypen ausgeführt werden. Eine Klasse, die mehrere verschiedene Datentypen anzeigen kann, könnte beispielsweise die folgenden Display-Prozeduren enthalten:

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

Ohne Überladung müssten Sie für jede Prozedur einen eigenen Namen erstellen, auch wenn alle Prozeduren dasselbe tun, wie nachfolgend gezeigt:

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

Die Überladung vereinfacht die Verwendung von Eigenschaften und Methoden, da sie eine Auswahl an verwendbaren Datentypen bereitstellt. So können Sie beispielsweise die bereits gezeigte überladene Display-Methode mit jedem der folgenden Codezeilen aufrufen:

' 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)

Zur Laufzeit ruft Visual Basic die korrekte Prozedur basierend auf den Datentypen der von Ihnen angegebenen Parameter auf.

Regeln für das Überladen

Um ein überladenes Member für eine Klasse zu erstellen, fügen Sie mindestens zwei Eigenschaften oder Methoden mit demselben Namen hinzu. Mit Ausnahme von überladenen abgeleiteten Membern muss jedes überladene Member unterschiedliche Parameterlisten besitzen. Außerdem dürfen die folgenden Elemente beim Überladen einer Eigenschaft oder Prozedur nicht als Unterscheidungsmerkmal verwendet werden:

  • Modifizierer wie ByVal oder ByRef, die für ein Member oder Parameter des Members gelten

  • Namen von Parametern

  • Rückgabetypen von Prozeduren

Das Schlüsselwort Overloads ist beim Überladen optional. Wenn jedoch ein überladenes Member das Schlüsselwort Overloads verwendet, müssen alle anderen überladenen Member mit demselben Namen dieses Schlüsselwort ebenfalls angeben.

Abgeleitete Klassen können geerbte Member mit Membern überladen, die identische Parameter und Parametertypen besitzen. Dieser Vorgang wird als Shadowing nach Name und Signatur bezeichnet. Wenn das Schlüsselwort Overloads beim Shadowing nach Name und Signatur verwendet wird, wird die Member-Implementierung der abgeleiteten Klasse anstatt der Implementierung der Basisklasse verwendet und alle anderen Überladungen für dieses Member stehen den Instanzen der abgeleiteten Klasse zur Verfügung.

Wenn das Schlüsselwort Overloads beim Überladen eines geerbten Members mit einem Member, das identische Parameter und Parametertypen besitzt, nicht angegeben wird, bezeichnet man die Überladung als Shadowing nach Name. Das Shadowing nach Name ersetzt die geerbte Implementierung eines Members und sorgt dafür, dass alle anderen Überladungen den Instanzen der abgeleiteten Klasse und ihren Nachkommen nicht zur Verfügung stehen.

Die Modifizierer Overloads und Shadows können nicht gleichzeitig mit derselben Eigenschaft oder Methode verwendet werden.

Beispiel

Im folgenden Beispiel werden überladene Methoden erstellt, die entweder eine String- oder eine Decimal-Darstellung eines Dollarbetrags akzeptieren und eine Zeichenfolge mit der Umsatzsteuer zurückgeben.

So erstellen Sie anhand dieses Beispiels eine überladene Methode

  1. Öffnen Sie ein neues Projekt, und fügen Sie eine Klasse mit dem Namen TaxClass hinzu.

  2. Fügen Sie der TaxClass -Klasse den folgenden Code hinzu.

    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. Fügen Sie die folgende Prozedur zu Ihrem Formular hinzu.

    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. Fügen Sie eine Schaltfläche zum Formular hinzu, und rufen Sie über das Ereignis Button1_Click der Schaltfläche die ShowTax-Prozedur auf.

  5. Führen Sie das Projekt aus, und klicken Sie die Schaltfläche des Formulars, um die überladene ShowTax-Prozedur zu testen.

Zur Laufzeit wählt der Compiler die entsprechende überladene Funktion aus, die mit den verwendeten Parametern übereinstimmt. Wenn Sie auf die Schaltfläche klicken, wird die überladene Methode zunächst mit einem Price-Parameter aufgerufen, der eine Zeichenfolge ist, und die Meldung „Price is a String. Tax is $5.12“ wird angezeigt. TaxAmount wird ein zweites Mal mit dem Wert Decimal aufgerufen, und die Meldung „Price is a Decimal. Tax is $5.12“ wird angezeigt.

Siehe auch