Prozedurüberladung (Visual Basic)

Das Überladen einer Prozedur bedeutet, sie in mehreren Versionen zu definieren, wobei derselbe Name, aber unterschiedliche Parameterlisten verwendet werden. Der Zweck der Überladung besteht darin, mehrere eng verwandte Versionen einer Prozedur zu definieren, ohne sie nach Namen unterscheiden zu müssen. Dazu variieren Sie die Parameterliste.

Regeln für das Überladen

Wenn Sie eine Prozedur überladen, gelten die folgenden Regeln:

  • Gleicher Name. Jede überladene Version muss denselben Prozedurnamen verwenden.

  • Unterschiedliche Signatur. Jede überladene Version muss sich in mindestens einem der folgenden Punkte von allen anderen überladenen Versionen unterscheiden:

    • Anzahl von Parametern

    • Reihenfolge der Parameter

    • Datentypen der Parameter

    • Anzahl der Typparameter (für eine generische Prozedur)

    • Rückgabetyp (nur für einen Konvertierungsoperator)

    Zusammen mit dem Prozedurnamen werden die vorherigen Elemente gemeinsam als Signatur der Prozedur bezeichnet. Wenn Sie eine überladene Prozedur aufrufen, verwendet der Compiler die Signatur, um zu überprüfen, ob der Aufruf ordnungsgemäß mit der Definition übereinstimmt.

  • Elemente, die nicht Teil der Signatur sind. Sie können eine Prozedur nicht überladen, ohne die Signatur zu ändern. Insbesondere können Sie eine Prozedur nicht überladen, indem Sie nur eins oder mehrere der folgenden Elemente variieren:

    • Prozedurmodifizierer-Schlüsselwörter (wie Public, Shared und Static)

    • Parameter- oder Typparameternamen

    • Typparametereinschränkungen (für eine generische Prozedur)

    • Parametermodifizierer-Schlüsselwörter (wie ByRef und Optional)

    • Ob ein Wert zurückgegeben wird

    • Der Datentyp des Rückgabewerts (mit Ausnahme eines Konvertierungsoperators)

    Die Elemente in der vorherigen Liste sind nicht Teil der Signatur. Obwohl Sie sie nicht verwenden können, um zwischen überladenen Versionen zu unterscheiden, können Sie sie zwischen überladenen Versionen variieren, die durch ihre Signaturen ordnungsgemäß unterschieden werden.

  • Spät gebundene Argumente. Wenn Sie eine spät gebundene Objektvariable an eine überladene Version übergeben möchten, müssen Sie den entsprechenden Parameter als Object deklarieren.

Mehrere Versionen einer Prozedur

Angenommen, Sie schreiben eine Sub-Prozedur, um eine Transaktion für den Saldo eines Kunden zu posten, und Sie möchten den Kunden entweder anhand des Namens oder der Kontonummer referenzieren können. Um dies zu erreichen, können Sie zwei verschiedene Sub-Prozeduren definieren, wie im folgenden Beispiel:

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

Alternativ können Sie einen einzelnen Prozedurnamen überladen. Sie können das Schlüsselwort Overloads verwenden, um eine Version der Prozedur für jede Parameterliste wie folgt zu definieren:

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 Sie außerdem einen Transaktionsbetrag in entweder Decimal oder Single akzeptieren möchten, können Sie post noch weiter überladen, um diese Variante zuzulassen. Wenn Sie dies für jede der Überladungen im vorherigen Beispiel täten, hätten Sie vier Sub-Prozeduren, die alle denselben Namen tragen, aber vier verschiedene Signaturen aufweisen.

Vorteile des Überladens

Der Vorteil des Überladens einer Prozedur liegt in der Flexibilität des Aufrufs. Um die im vorherigen Beispiel deklarierte post-Prozedur zu verwenden, kann der aufrufende Code die Kunden-ID entweder als String oder als Integer abrufen und dann in beiden Fällen dieselbe Prozedur aufrufen. Das folgende Beispiel veranschaulicht dies:

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

Weitere Informationen