Freigeben über


Überlegungen zur Prozedurüberladung (Visual Basic)

Wenn Sie eine Prozedur überladen, müssen Sie für jede überladene Version eine andere Signatur verwenden. Das bedeutet für gewöhnlich, dass jede Version eine andere Parameterliste angeben muss. Weitere Informationen finden Sie unter „Unterschiedliche Signatur“ in Prozedurüberladung.

Sie können eine Function-Prozedur mit einer Sub-Prozedur überladen und umgekehrt, vorausgesetzt, die beiden Prozeduren besitzen unterschiedliche Signaturen. Zwei Überladungen können sich nicht nur darin unterscheiden, dass eine davon einen Rückgabewert hat und die andere nicht.

Sie können eine Eigenschaft auf dieselbe Weise überladen wie eine Prozedur, und es gelten dieselben Einschränkungen. Die Überladung einer Prozedur mit einer Eigenschaft oder umgekehrt ist allerdings nicht möglich.

Alternativen zu überladenen Versionen

Manchmal gibt es Alternativen zu überladenen Versionen, insbesondere dann, wenn ein Argument optional oder die Anzahl an Argumenten variabel ist.

Beachten Sie, dass optionale Argumente nicht zwingend von allen Sprachen unterstützt werden und Parameterarrays auf Visual Basic beschränkt sind. Wenn Sie eine Prozedur verfassen, die wahrscheinlich von Code in einer der vielen verschiedenen Sprachen aufgerufen wird, bieten überladene Versionen die größte Flexibilität.

Überladungen und optionale Argumente

Wenn der aufrufende Code ein Argument oder mehrere Argumente optional bereitstellen oder weglassen kann, können Sie mehrere überladene Versionen definieren oder optionale Parameter verwenden.

Anwendungsfälle für überladene Versionen

In den folgenden Fällen kommt die Definition einer Reihe von überladenen Versionen in Betracht:

  • Die Logik im Prozedurcode unterscheidet sich erheblich, je nachdem, ob der aufrufende Code ein optionales Argument bereitstellt oder nicht.

  • Der Prozedurcode kann nicht zuverlässig testen, ob der aufrufende Code ein optionales Argument bereitgestellt hat. Dies ist z. B. der Fall, wenn es keinen möglichen Kandidaten für einen Standardwert gibt, dessen Bereitstellung vom aufrufenden Code nicht erwartet werden konnte.

Anwendungsfälle für optionale Parameter

In den folgenden Fällen bietet sich die Verwendung von mindestens einem optionalen Parameter an:

  • Die einzige erforderliche Aktion in dem Fall, dass der aufrufende Code kein optionales Argument bereitstellt, besteht darin, den Parameter auf den Standardwert festzulegen. Dan kann der Prozedurcode weniger kompliziert ausfallen, wenn Sie eine einzelne Version mit mindestens einem Optional-Parameter definieren.

Weitere Informationen finden Sie unter Optionale Parameter.

Überladungen und ParamArrays

Wenn der aufrufende Code eine variable Anzahl an Argumenten übergeben kann, können Sie mehrere überladene Versionen definieren oder ein Parameterarray verwenden.

Anwendungsfälle für überladene Versionen

In den folgenden Fällen kommt die Definition einer Reihe von überladenen Versionen in Betracht:

  • Sie wissen, dass der aufrufende Code stets nur eine kleine Anzahl an Werten an das Parameterarray übergibt.

  • Die Logik im Prozedurcode unterscheidet sich erheblich, je nachdem, wie viele Werte der aufrufende Code übergibt.

  • Der aufrufende Code kann Werte mit verschiedenen Datentypen übergeben.

Anwendungsfälle für ein Parameterarray

In den folgenden Fällen ist ein ParamArray-Parameter eine sinnvollere Lösung:

  • Sie können nicht vorhersagen, wie viele Werte der aufrufende Code an das Parameterarray übergeben kann, und es könnte sich um eine hohe Anzahl handeln.

  • Die Prozedurlogik eignet sich zum Durchlaufen aller Werte, die der aufrufende Code übergibt, wobei im Wesentlichen dieselben Vorgänge auf jedem Wert ausgeführt werden.

Weitere Informationen finden Sie unter Parameterarrays.

Implizite Überladungen für optionale Parameter

Eine Prozedur mit einem optionalen Parameter entspricht zwei überladenen Prozeduren, einer mit dem optionalen Parameter und einer ohne ihn. Sie können eine solche Prozedur nicht mit einer Parameterliste überladen, die einem dieser beiden Fälle entspricht. Die folgenden Deklarationen veranschaulichen dies:

Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)
' The preceding definition is equivalent to the following two overloads.
' Overloads Sub q(ByVal b As Byte)
' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
' Therefore, the following overload is not valid because the signature is already in use.
' Overloads Sub q(ByVal c As Byte, ByVal k As Long)
' The following overload uses a different signature and is valid.
Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)

Bei einer Prozedur mit mehreren optionalen Parametern gibt es eine Reihe impliziter Überladungen, die sich aus einer Logik ergeben, die der im vorhergehenden Beispiel ähnelt.

Implizite Überladungen für den ParamArray-Parameter

Der Compiler geht davon aus, dass eine Prozedur mit einem ParamArray-Parameter eine unendliche Anzahl an Überladungen hat, die sich darin unterscheiden, was der aufrufende Code an das Parameterarray übergibt:

  • Eine Überladung, wenn der aufrufende Code kein Argument an das ParamArray übergibt

  • Eine Überladung, wenn der aufrufende Code ein eindimensionales Array des Elementtyps ParamArray bereitstellt

  • Für jede positive Ganzzahl eine Überladung, wenn der aufrufende Code diese Anzahl an Argumenten bereitstellt, die alle vom Elementtyp ParamArray sind

Die folgenden Deklarationen zeigen diese impliziten Überladungen.

Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)
' The preceding definition is equivalent to the following overloads.
' Overloads Sub p(ByVal d As Date)
' Overloads Sub p(ByVal d As Date, ByVal c() As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char)
' And so on, with an additional Char argument in each successive overload.

Sie können eine solche Prozedur nicht mit einer Parameterliste überladen, die ein eindimensionales Array für das Parameterarray verwendet. Sie können jedoch die Signaturen der anderen impliziten Überladungen verwenden. Die folgenden Deklarationen veranschaulichen dies:

' The following overload is not valid because it takes an array for the parameter array.
' Overloads Sub p(ByVal x As Date, ByVal y() As Char)
' The following overload takes a single value for the parameter array and is valid.
Overloads Sub p(ByVal z As Date, ByVal w As Char)

Typenlose Programmierung als Alternative zu Überladungen

Wenn Sie zulassen möchten, dass der aufrufende Code unterschiedliche Datentypen an einen Parameter übergibt, stellt die typenlose Programmierung eine Alternative dar. Sie können den Typüberprüfungsswitch auf Off festlegen, mit der Compileroption Option Strict Statement oder -optionstrict. Dann müssen Sie den Datentyp des Parameters nicht deklarieren. Dieser Ansatz hat im Vergleich zu Überladungen jedoch die folgenden Nachteile:

  • Die typenlose Programmierung erzeugt einen weniger effizienten Ausführungscode.

  • Die Prozedur muss einen Test auf jeden Datentyp durchführen, dessen Übergabe erwartet wird.

  • Der Compiler kann keinen Fehler signalisieren, wenn der aufrufende Code einen Datentyp übergibt, den die Prozedur nicht unterstützt.

Weitere Informationen