Prozedurüberladung
Aktualisiert: November 2007
Unter dem Überladen einer Prozedur versteht man die Definition mehrerer Prozedurversionen gleichen Namens mit unterschiedlichen Parameterlisten. Durch die Überladung können mehrere ähnliche Prozedurversionen definiert werden, ohne dass diese nach Namen voneinander unterschieden werden müssen. Die Unterscheidung wird durch Abwandeln der Parameterlisten vorgenommen.
Überladen von Regeln
Für das Überladen von Prozeduren gelten folgende Regeln:
Gleicher Name. Alle überladenen Versionen müssen den gleichen Prozedurnamen verwenden.
Unterschiedliche Signaturen Die überladenen Versionen müssen sich in mindestens einem der folgenden Aspekte unterscheiden:
Anzahl der Parameter
Reihenfolge der Parameter
Datentyp der Parameter
Anzahl der Typparameter (bei einer generischen Prozedur)
Rückgabetyp (nur für einen Konvertierungsoperator)
Zusammen mit dem Prozedurnamen werden die voranstehenden Elemente als Signatur der Prozedur bezeichnet. Beim Aufruf einer überladenen Prozedur prüft der Compiler anhand der Signatur, ob der Aufruf der Definition entspricht.
Elemente, die nicht Teil der Signatur sind. Eine Prozedur kann ohne Abwandlung der Signatur nicht überladen werden. Zum Überladen einer Prozedur ist es jedoch nicht ausreichend, nur eines oder mehrere der folgenden Elemente abzuwandeln:
Schlüsselwörter für Prozedurmodifizierer, z. B. Public, Shared und Static
Parameter oder Typparameternamen
Typparametereinschränkungen (für eine generische Prozedur)
Schlüsselwörter für Parametermodifizierer, z. B. ByRef und Optional
Ob sie einen Wert zurückgibt
Datentyp des Rückgabewerts (außer bei einem Konvertierungsoperator)
Die Elemente in der obigen Liste sind nicht Bestandteil der Signatur. Obwohl sie nicht zur Unterscheidung überladener Versionen verwendet werden können, können Sie sie in überladenen Versionen abwandeln, die durch ihre Signaturen ordnungsgemäß unterschieden werden.
Spät gebundene Argumente. Wenn Sie beabsichtigen, eine spät gebundene Objektvariable an eine überladene Version zu übergeben, müssen Sie den entsprechenden Parameter als Object deklarieren.
Mehrere Versionen einer Prozedur
Angenommen, Sie schreiben eine Sub-Prozedur zum Ausführen einer Transaktion mit Auswirkung auf das Kundenguthaben und möchten sich sowohl über den Namen als auch über die Kontonummer auf den Kunden beziehen können. Dies können Sie durch die Definition zweier unterschiedlicher Sub-Prozeduren erreichen, wie im folgenden Beispiel gezeigt:
Sub postName(ByVal custName As String, ByVal amount As Single)
' Insert code to access customer record by customer name.
End Sub
Sub postAcct(ByVal custAcct As Integer, ByVal amount As Single)
' Insert code to access customer record by account number.
End Sub
Überladene Versionen
Eine Alternative stellt das Überladen eines einzelnen Prozedurnamens dar. Um für jede Parameterliste eine Version der Prozedur zu definieren, wird das Overloads-Schlüsselwort folgendermaßen verwendet:
Overloads Sub post(ByVal custName As String, ByVal amount As Single)
' Insert code to access customer record by customer name.
End Sub
Overloads Sub post(ByVal custAcct As Integer, ByVal amount As Single)
' Insert code to access customer record by account number.
End Sub
Zusätzliche Überladungen
Wenn auch ein Transaktionswert in Decimal oder Single akzeptiert werden soll, können Sie darüber hinaus noch post überladen. Wenn Sie dies in jeder Überladung im obigen Beispiel durchgeführt hätten, hätte dies vier Sub-Prozeduren gleichen Namens mit vier unterschiedlichen Signaturen ergeben.
Vorteile des Überladens
Der Vorteil der Prozedurüberladung liegt in der Flexibilität des Aufrufs. Um die im letzten Beispiel deklarierte post-Prozedur zu verwenden, kann der Aufrufcode die Kundenkennung entweder als String oder als Integer abrufen; in beiden Fällen wird anschließend dieselbe Prozedur aufgerufen. Dies wird anhand des folgenden Beispiels veranschaulicht:
Imports MSVB = Microsoft.VisualBasic
Dim customer As String
Dim accountNum As Integer
Dim amount As Single
customer = MSVB.Interaction.InputBox("Enter customer name or number")
amount = MSVB.Interaction.InputBox("Enter transaction amount")
Try
accountNum = CInt(customer)
Call post(accountNum, amount)
Catch
Call post(customer, amount)
End Try
Siehe auch
Aufgaben
Gewusst wie: Definieren mehrerer Versionen einer Prozedur
Gewusst wie: Aufrufen einer überladenen Prozedur
Gewusst wie: Überladen einer Prozedur mit optionalen Parametern
Gewusst wie: Überladen einer Prozedur mit einer unbestimmten Anzahl von Parametern
Konzepte
Überlegungen zur Prozedurüberladung
Generische Typen in Visual Basic