Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn Sie eine Prozedur überladen, müssen Sie für jede überladene Version eine andere Signatur verwenden. Dies bedeutet in der Regel, 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, sie haben 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
Es gibt manchmal Alternativen zu überladenen Versionen, insbesondere wenn das Vorhandensein von Argumenten optional ist oder ihre Zahl variabel ist.
Denken Sie daran, dass optionale Argumente nicht unbedingt von allen Sprachen unterstützt werden, und Parameterarrays sind auf Visual Basic beschränkt. Wenn Sie eine Prozedur schreiben, die wahrscheinlich aus Code aufgerufen wird, der in einer der verschiedenen Sprachen geschrieben wird, bieten überladene Versionen die größte Flexibilität.
Überladungen und optionale Argumente
Wenn der aufrufende Code optional ein oder mehrere Argumente auslassen kann, können Sie mehrere überladene Versionen definieren oder optionale Parameter verwenden.
Wann man überladene Versionen verwenden sollte
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 beispielsweise der Fall, wenn es keinen möglichen Kandidaten für einen Standardwert gibt, den man vom aufrufenden Code nicht erwarten würde bereitzustellen.
Gründe für die Verwendung optionaler Parameter
In den folgenden Fällen bevorzugen Sie möglicherweise einen oder mehrere optionale Parameter:
- Die einzige erforderliche Aktion, wenn der aufrufende Code kein optionales Argument angibt, besteht darin, den Parameter auf einen Standardwert festzulegen. In einem solchen Fall kann der Prozedurcode weniger kompliziert sein, wenn Sie eine einzelne Version mit einem oder
Optional
mehreren Parametern definieren.
Weitere Informationen finden Sie unter "Optionale Parameter".
Überladungen und ParamArrays
Wenn der aufrufende Code eine variable Anzahl von Argumenten übergeben kann, können Sie mehrere überladene Versionen definieren oder ein Parameterarray verwenden.
Wann man überladene Versionen verwenden sollte
In den folgenden Fällen kommt die Definition einer Reihe von überladenen Versionen in Betracht:
Sie wissen, dass der aufrufende Code niemals mehr als eine kleine Anzahl von Werten an das Parameterarray übergibt.
Die Logik im Prozedurcode unterscheidet sich erheblich von der Anzahl der Werte, die der aufrufende Code übergibt.
Der aufrufende Code kann Werte verschiedener Datentypen übergeben.
Wann man ein Parameter-Array verwenden sollte
Sie werden in den folgenden Fällen besser von einem ParamArray
Parameter bedient:
Sie können nicht vorhersagen, wie viele Werte der aufrufende Code an das Parameterarray übergeben kann, und es kann eine große Zahl sein.
Die Prozedurlogik eignet sich zum Durchlaufen aller Werte, die der aufrufende Code übergibt, und führt im Wesentlichen dieselben Vorgänge für jeden Wert aus.
Weitere Informationen finden Sie unter Parameterarrays.
Implizite Überladungen für optionale Parameter
Eine Prozedur mit einem Optional-Parameter entspricht zwei überladenen Prozeduren, eines mit dem optionalen Parameter und einer ohne diesen. Sie können eine solche Prozedur nicht mit einer Parameterliste überladen, die einer dieser Parameter 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)
Für eine Prozedur mit mehr als einem optionalen Parameter gibt es eine Reihe impliziter Überladungen, die von einer Logik wie im vorherigen Beispiel erreicht werden.
Implizite Überladungen für einen ParamArray-Parameter
Der Compiler betrachtet eine Prozedur mit einem ParamArray-Parameter als eine, die eine unendliche Anzahl von Überladungen hat, die sich darin unterscheiden, was der aufrufende Code an das Parameterarray übergibt, wie folgt:
Eine Überladung, wenn der aufrufende Code kein Argument an das
ParamArray
übergibtEine Überladung für den Zeitpunkt, an dem der aufrufende Code ein eindimensionales Array des
ParamArray
Elementtyps bereitstelltFür jede positive ganze Zahl gibt es eine Überladung für den Fall, dass der aufrufende Code diese Anzahl von Argumenten bereitstellt, wobei jedes Argument vom Typ
ParamArray
ist.
Die folgenden Deklarationen veranschaulichen 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)
Typlose Programmierung als Alternative zur Überladung
Wenn Sie zulassen möchten, dass der aufrufende Code verschiedene Datentypen an einen Parameter übergibt, ist eine alternative Methode die typlose Programmierung. Sie können den Typüberprüfungsswitch auf Off
festlegen, mit der Compileroption Option Strict Statement oder -optionstrict. Anschließend müssen Sie den Datentyp des Parameters nicht deklarieren. Dieser Ansatz hat jedoch im Vergleich zur Überlastung folgende Nachteile:
Die typlose Programmierung erzeugt weniger effizienten Ausführungscode.
Die Prozedur muss jeden Datentyp testen, den sie erwartet, dass ihm übergeben wird.
Der Compiler kann keinen Fehler signalisieren, wenn der aufrufende Code einen Datentyp übergibt, den die Prozedur nicht unterstützt.
Siehe auch
- Vorgehensweisen
- Parameter und Argumente von Prozeduren
- Problembehandlungsverfahren
- So definieren Sie mehrere Versionen eines Verfahrens
- Anleitung: Aufrufen einer überladenen Prozedur
- Vorgehensweise: Überladen einer Prozedur, die optionale Parameter akzeptiert
- Vorgehensweise: Überladen einer Prozedur, die eine unbegrenzte Anzahl von Parametern akzeptiert
- Überladungsauflösung
- Überladungen