Ü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
oderByRef
, die für ein Member oder Parameter des Members geltenNamen 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
Öffnen Sie ein neues Projekt, und fügen Sie eine Klasse mit dem Namen
TaxClass
hinzu.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
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
Fügen Sie eine Schaltfläche zum Formular hinzu, und rufen Sie über das Ereignis
Button1_Click
der Schaltfläche dieShowTax
-Prozedur auf.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.