Überlegungen zur Prozedurüberladung
Aktualisiert: November 2007
Wenn Sie eine Prozedur überladen, müssen Sie für jede überladene Version eine andere Signatur verwenden. Dies bedeutet normalerweise, dass jede Version eine andere Parameterliste angeben muss. Weitere Informationen finden Sie im Abschnitt "Unterschiedliche Signaturen" unter Prozedurüberladung.
Function-Prozeduren können mit Sub-Prozeduren überladen werden und umgekehrt, sofern sie unterschiedliche Signaturen besitzen. Zwei Überladungen können sich nicht nur darin unterscheiden, dass die eine Überladung einen Rückgabewert hat und die andere nicht.
Eigenschaften werden auf die gleiche Weise und mit den gleichen Beschränkungen überladen wie Prozeduren. Sie können jedoch keine Prozedur mit einer Eigenschaft überladen oder umgekehrt.
Alternativen zu überladenen Versionen
Gelegentlich stehen Alternativen zu überladenen Versionen zur Verfügung, insbesondere wenn das Vorhandensein von Argumenten optional ist oder wenn die Anzahl der Argumente variabel ist.
Denken Sie daran, dass optionale Argumente nicht unbedingt von allen Sprachen unterstützt werden und Parameterarrays auf Visual Basic beschränkt sind. Wenn Sie eine Prozedur schreiben, die möglicherweise von Code aufgerufen wird, der in anderen Sprachen geschrieben wurde, bieten überladene Versionen die größte Flexibilität.
Überladungen und optionale Argumente
Wenn der Aufrufcode optional ein oder mehrere Argumente angeben oder weglassen kann, können Sie mehrere überladene Versionen definieren oder optionale Parameter verwenden.
Verwendung von überladenen Versionen
In folgenden Fällen können Sie die Definition einer Reihe überladener Versionen in Betracht ziehen:
Je nachdem, ob der Aufrufcode ein optionales Argument angibt oder nicht, weist die Logik im Prozedurcode bedeutende Unterschiede auf.
Der Prozedurcode kann nicht zuverlässig testen, ob der Aufrufcode ein optionales Argument angegeben hat. Dies ist z. B. dann der Fall, wenn es keinen möglichen Kandidaten für einen Standardwert gibt, dessen Angabe durch den Aufrufcode nicht zu erwarten ist.
Verwendung optionaler Parameter
In folgenden Fällen ist die Verwendung mindestens eines optionalen Parameters vorzuziehen:
- Wenn der Aufrufcode kein optionales Argument angibt, besteht die einzige erforderliche Aktion darin, den Parameter auf einen Standardwert festzulegen. In einem solchen Fall wird der Prozedurcode unter Umständen vereinfacht, wenn Sie eine einzelne Version mit mindestens einem Optional-Parameter definieren.
Weitere Informationen finden Sie unter Optionale Parameter.
Überladungen und ParamArrays
Wenn der Aufrufcode eine variable Anzahl von Argumenten übergeben kann, können Sie mehrere überladene Versionen definieren oder ein Parameterarray verwenden.
Verwendung von überladenen Versionen
In folgenden Fällen können Sie die Definition einer Reihe überladener Versionen in Betracht ziehen:
Sie wissen, dass der Aufrufcode immer nur eine kleine Anzahl von Werten an den Parameterarray übergibt.
Je nach der Anzahl der vom Aufrufcode übergebenen Werte ist die Logik im Prozedurcode sehr unterschiedlich.
Der Aufrufcode kann Werte unterschiedlicher Datentypen übergeben.
Verwendung eines Parameterarrays
In folgenden Fällen stellt ein ParamArray-Parameter die bessere Lösung dar:
Sie können nicht vorhersagen, wie viele Werte der Aufrufcode an den Parameterarray übergeben kann, und es kann sich um eine große Anzahl von Werten handeln.
Die Prozedurlogik selbst eignet sich dazu, alle vom Aufrufcode übergebenen Werte zu durchlaufen, wobei für jeden Wert im Wesentlichen die gleichen Vorgänge ausgeführt werden.
Weitere Informationen finden Sie unter Parameterarrays.
Implizite Überladungen für optionale Parameter
Eine Prozedur mit einem Optional (Visual Basic)-Parameter entspricht zwei überladenen Prozeduren, einer mit dem optionalen Parameter und einer ohne. Sie können eine solche Prozedur nicht mit einer Parameterliste überladen, die einer dieser beiden Prozeduren entspricht. Die folgenden Deklarationen verdeutlichen 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 mehr als einem optionalen Parameter gibt es eine Reihe impliziter Überladungen, die sich aus einer dem vorhergehenden Beispiel ähnelnden Logik ergeben.
Implizite Überladungen für ParamArray-Parameter
Bei Prozeduren mit einem ParamArray-Parameter geht der Compiler davon aus, dass sie über eine unendliche Anzahl von Überladungen verfügen, die sich bezüglich der vom Aufrufcode an das Parameterarray übergebenen Werte wie folgt unterscheiden:
Eine Überladung für den Fall, dass der Aufrufcode kein Argument an ParamArray übergibt
Eine Überladung für den Fall, dass der Aufrufcode ein eindimensionales Array des ParamArray-Elementtyps angibt
Für jede positive ganze Zahl eine Überladung für den Fall, dass der Aufrufcode die entsprechende Anzahl von Argumenten angibt; diese gehören jeweils zum ParamArray-Elementtyp.
Die folgenden Deklarationen verdeutlichen 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.
Solche Prozeduren können nicht mit einer Parameterliste überladen werden, die ein eindimensionales Array als Parameterarray annimmt. Sie können jedoch die Signaturen der anderen impliziten Überladungen verwenden. Die folgenden Deklarationen verdeutlichen 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)
Programmierung ohne Datentypen als Alternative zur Überladung
Wenn der Aufrufcode unterschiedliche Datentypen an einen Parameter übergeben soll, können Sie auch Typenloses Programmieren in Visual Basic verwenden. Mit der Option Strict-Anweisung oder der /optionstrict-Compileroption können Sie für die Typüberprüfung den Wert Off festlegen. Danach müssen Sie den Datentyp des Parameters nicht deklarieren. Im Vergleich zum Überladen hat dieser Ansatz jedoch folgende Nachteile:
Die Programmierung ohne Datentypen ergibt weniger effizienten Ausführungscode.
Die Prozedur muss das Vorhandensein jedes Datentyps testen, dessen Übergabe sie erwartet.
Der Compiler kann keinen Fehler signalisieren, wenn der aufrufende Code einen Datentyp übergibt, den die Prozedur nicht unterstützt.
Siehe auch
Aufgaben
Verfahren zur Problembehandlung
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
Parameter und Argumente von Prozeduren