Computerwissenschaften

Methodenüberladung

Funktionen und Verfahren sind ein wichtiger Bestandteil der Delphi-Sprache. Ab Delphi 4 können wir mit Delphi mit Funktionen und Prozeduren arbeiten, die Standardparameter unterstützen (wobei die Parameter optional sind), und zwei oder mehr Routinen können denselben Namen haben, aber als völlig unterschiedliche Routinen arbeiten.

Mal sehen, wie Überladen und Standardparameter Ihnen helfen können, besser zu codieren.

 

Überlastung

Einfach ausgedrückt bedeutet Überladung, dass mehr als eine Routine mit demselben Namen deklariert wird. Durch Überladen können mehrere Routinen verwendet werden, die denselben Namen haben, jedoch eine unterschiedliche Anzahl von Parametern und Typen aufweisen.

Betrachten wir als Beispiel die folgenden zwei Funktionen:

 {Overloaded routines must be declared with the overload directive}
function SumAsStr(a, b :integer): string; overload;
begin Result := IntToStr(a + b) ;
end;
function SumAsStr(a, b : extended; Digits:integer): string; overload;
begin Result := FloatToStrF(a + b, ffFixed, 18, Digits) ;
end; 

Diese Deklarationen erstellen zwei Funktionen, beide SumAsStr genannt, die eine unterschiedliche Anzahl von Parametern annehmen und von zwei verschiedenen Typen sind. Wenn wir eine überladene Routine aufrufen, muss der Compiler erkennen können, welche Routine wir aufrufen möchten.

Beispielsweise ruft SumAsStr (6, 3) die erste SumAsStr-Funktion auf, da ihre Argumente ganzzahlig sind.

Hinweis: Delphi hilft Ihnen bei der Auswahl der richtigen Implementierung mithilfe von Code-Vervollständigung und Code-Einblick.

Überlegen Sie sich andererseits, ob wir versuchen, die SumAsStr-Funktion wie folgt aufzurufen:

 SomeString := SumAsStr(6.0,3.0) 

Es wird eine Fehlermeldung angezeigt : “ Es gibt keine überladene Version von ‚SumAsStr‘, die mit diesen Argumenten aufgerufen werden kann. “ Dies bedeutet, dass wir auch den Parameter Digits einschließen sollten, mit dem die Anzahl der Stellen nach dem Dezimalpunkt angegeben wird.

Hinweis: Beim Schreiben überladener Routinen gibt es nur eine Regel : Eine überladene Routine muss sich in mindestens einem Parametertyp unterscheiden. Der Rückgabetyp kann stattdessen nicht zur Unterscheidung zwischen zwei Routinen verwendet werden.

 

Zwei Einheiten – eine Routine

Angenommen, wir haben eine Routine in Einheit A, und Einheit B verwendet Einheit A, deklariert jedoch eine Routine mit demselben Namen. Die Deklaration in Einheit B benötigt keine Überladungsanweisung. Wir sollten den Namen von Einheit A verwenden, um Aufrufe der Routineversion von Einheit B von Einheit B zu qualifizieren.

Betrachten Sie so etwas:

 unit B;
...
uses A;
...
procedure RoutineName;
beginResult := A.RoutineName;
end; 

Eine Alternative zur Verwendung überladener Routinen ist die Verwendung von Standardparametern, was normalerweise dazu führt, dass weniger Code geschrieben und verwaltet werden muss.

 

Standard- / optionale Parameter

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, wodurch sie optional wird. Um einen Standardwert bereitzustellen, beenden Sie die Parameterdeklaration mit dem Gleichheitszeichen (=), gefolgt von einem konstanten Ausdruck.

Zum Beispiel angesichts der Erklärung

 function SumAsStr (a,b : extended; Digits : integer=2) : string; 

Die folgenden Funktionsaufrufe sind äquivalent.

 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.

Wenn Sie Routinen mit mehr als einem Standardparameter aufrufen, können wir keine Parameter überspringen (wie in VB):

 function SkipDefParams(var A:string; B:integer=5, C:boolean=False):boolean;
...
//this call generates an error message
CantBe := SkipDefParams('delphi', , True) ; 

 

Überladen mit Standardparametern

Führen Sie keine mehrdeutigen Routinedeklarationen ein, wenn Sie sowohl Funktions- oder Prozedurüberladung als auch Standardparameter verwenden.

Beachten Sie die folgenden Erklärungen:

 procedure DoIt(A:extended; B:integer=0) ; overload;
procedure DoIt(A:extended) ; overload; 

Der Aufruf der DoIt-Prozedur wie DoIt (5.0) wird nicht kompiliert. Aufgrund des Standardparameters in der ersten Prozedur ruft diese Anweisung möglicherweise beide Prozeduren auf, da nicht angegeben werden kann, welche Prozedur aufgerufen werden soll.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.