Funktionen und Prozeduren sind ein wichtiger Bestandteil der Delphi-Sprache. Ab Delphi 4 können wir in Delphi mit Funktionen und Prozeduren arbeiten, die Standardparameter unterstützen (wobei die Parameter optional sind), und es können zwei oder mehr Routinen denselben Namen haben, aber als völlig unterschiedliche Routinen ausgeführt werden.
Sehen wir uns an, wie Sie mit Überladung und Standardparametern besser programmieren können.
Einfach ausgedrückt, bedeutet Überladen, dass mehr als eine Routine mit demselben Namen deklariert wird. Überladen ermöglicht es uns, mehrere Routinen mit demselben Namen, aber einer unterschiedlichen Anzahl von Parametern und Typen zu verwenden.
Betrachten wir als Beispiel die folgenden zwei Funktionen:
Überladene Routinen müssen mit der Überladeanweisung deklariert werden Funktion SumAsStr (a, b: Ganzzahl): Zeichenfolge; Überlast; Start Ergebnis: = IntToStr (a + b); Ende; Funktion SumAsStr (a, b: erweitert; Ziffern: ganze Zahl): Zeichenfolge; Überlast; Start Ergebnis: = FloatToStrF (a + b, ffFixed, 18, Digits); Ende;
Diese Deklarationen erstellen zwei Funktionen, die beide SumAsStr genannt werden und eine unterschiedliche Anzahl von Parametern und zwei unterschiedliche Typen haben. Wenn wir eine überladene Routine aufrufen, muss der Compiler in der Lage sein, zu bestimmen, welche Routine aufgerufen werden soll.
Beispielsweise ruft SumAsStr (6, 3) die erste SumAsStr-Funktion auf, da ihre Argumente ganzzahlig sind.
Hinweis: Delphi unterstützt Sie bei der Auswahl der richtigen Implementierung mit Hilfe von Code Completion und Code Insight.
Überlegen Sie andererseits, ob wir versuchen, die SumAsStr-Funktion wie folgt aufzurufen:
SomeString: = SumAsStr (6.0,3.0)
Es wird ein Fehler angezeigt, der lautet: "Es gibt keine überladene Version von 'SumAsStr', die mit diesen Argumenten aufgerufen werden kann."Dies bedeutet, dass wir auch den Parameter Digits einfügen sollten, mit dem die Anzahl der Nachkommastellen angegeben wird.
Hinweis: Es gibt nur eine Regel beim Schreiben überladener Routinen, und zwar, dass sich eine überladene Routine in mindestens einem Parametertyp unterscheiden muss. Der Rückgabetyp kann stattdessen nicht zur Unterscheidung zwischen zwei Routinen verwendet werden.
Nehmen wir an, wir haben eine Routine in Einheit A, und Einheit B verwendet Einheit A, deklariert jedoch eine Routine mit demselben Namen. Die Deklaration in Unit B benötigt keine Überladungs-Direktive - wir sollten den Namen von Unit A verwenden, um Aufrufe der A-Version der Routine von Unit B zu qualifizieren.
Betrachten Sie etwas davon:
Einheit B;… Verwendet EIN;… Verfahren RoutineName; Start Ergebnis: = A.RoutineName; Ende;
Eine Alternative zur Verwendung überladener Routinen besteht in der Verwendung von Standardparametern, wodurch normalerweise weniger Code geschrieben und verwaltet werden muss.
Um einige Anweisungen zu vereinfachen, können wir einen Standardwert für den Parameter einer Funktion oder Prozedur angeben und die Routine mit oder ohne Parameter aufrufen, sodass sie optional ist. Um einen Standardwert bereitzustellen, beenden Sie die Parameterdeklaration mit dem Gleichheitszeichen (=) gefolgt von einem konstanten Ausdruck.
Zum Beispiel angesichts der Deklaration
Funktion SumAsStr (a, b: erweitert; Ziffern: Ganzzahl = 2): Zeichenfolge;
Die folgenden Funktionsaufrufe sind gleichwertig.
SumAsStr (6.0, 3.0)
SumAsStr (6.0, 3.0, 2)
Hinweis: Parameter mit Standardwerten müssen am Ende der Parameterliste stehen und als Wert oder als const übergeben werden. Ein Referenzparameter (var) kann keinen Standardwert haben.
Beim Aufruf von Routinen mit mehr als einem Standardparameter können keine Parameter übersprungen werden (wie in VB):
Funktion SkipDefParams (var Ein Faden; B: Ganzzahl = 5, C: Boolescher Wert = Falsch): Boolescher Wert;… // Dieser Aufruf erzeugt eine Fehlermeldung CantBe: = SkipDefParams ('delphi',, True);
Führen Sie keine mehrdeutigen Routinedeklarationen ein, wenn Sie sowohl Funktions- oder Prozedurüberladung als auch Standardparameter verwenden.
Beachten Sie die folgenden Erklärungen:
Verfahren DoIt (A: erweitert; B: Ganzzahl = 0); Überlast; Verfahren DoIt (A: erweitert); Überlast;
Der Aufruf der DoIt-Prozedur wie DoIt (5.0) wird nicht kompiliert. Aufgrund des Standardparameters in der ersten Prozedur kann diese Anweisung beide Prozeduren aufrufen, da nicht erkennbar ist, welche Prozedur aufgerufen werden soll.