![]() |
Funktion Überladen --> Doppeldeutiger überladener Aufruf
Hallo!
Ich will eine Funktion GetString(ID: Integer) schreiben, die mir aus einer Liste einen bestimmten String liefert. Optional soll es zwei weitere Möglichkeiten geben: 1. String-Formatierung mit der Format() Funktion 2. String-Formatierung mit bestimmten, selbstdefinierten Optionen Für diese Möglichkeiten habe ich die Funktion wie folgt überladen:
Delphi-Quellcode:
Mit dieser Definition sollten eigentlich folgende Aufrufe der Funktion möglich sein:
type
TStringOption = (soQuoted, soBlank, soColon); TStringOptions = set of TStringOption; function GetString(ID: Integer; StringOptions: TStringOptions=[]): String; overload; function GetString(ID: Integer; Args: array of TVarRec): String; overload; function GetString(ID: Integer; StringOptions: TStringOptions; Args: array of TVarRec): String; overload; implementation function GetString(ID: Integer; StringOptions: TStringOptions=[]): String; begin result := GetString(ID, StringOptions, []); end; function GetString(ID: Integer; Args: array of TVarRec): String; var dummy: TStringOptions; begin dummy := []; result := GetString(ID, dummy, Args); end; function GetString(ID: Integer; StringOptions: TStringOptions; Args: array of TVarRec): String; begin result := IrgendwieStringHolen(ID); Format(result, Args); if (soColon in StringOptions) then result := result+':'; if (soBlank in StringOptions) then result := result+' '; if (soQuoted in StringOptions) then result := '"'+result+'"'; end;
Delphi-Quellcode:
Auf den Aufrufen von 2 und 3 erhalte ich jedoch die Meldung Doppeldeutiger überladener Aufruf von 'GetString'. Eigentlich sollte Delphi doch durch den Typ der Parameter bestimmen können, welche Funktion genutzt werden soll. Einmal ist der zweite Parameter eindeutig ein Array und einmal eindeutig eine Menge. Wo ist also das Problem?
GetString(123); // Unformatierten String erhalten
GetString(123, [soQuoted]); // String mit ".." erhalten GetString(123, ['hallo']); // String erhalten bei dem ein %s durch "hallo" ersetzt ist // String mit ".." erhalten und bei dem ein %s durch "hallo" ersetzt ist GetString(123, [soQuoted], ['hallo']); Ich habe schon versucht die Defaultbelegung TStringOptions=[] wegzulassen und stattdessen eine weitere überladene Version der Funktion zu nutzen. Das Ergebnis ist das Gleiche. Die Funktion GetString zusammen mit dem TVarRec nutze ich schon an sehr vielen Stellen in meinen Programmen. Ich wollte nun nur zusätlich die eigenen Optionen einfügen, ohne dass die vorhandenen Aufrufe von GetString geändert werden müssen. Was mache ich also falsch und wie lässt sich das Problem umgehen? Natürlich könnte ich nur eine Version der Funktion benutzen bei der alle Parameter angegeben werden müssen. Aber zum einen sollte das Überladen von Funktionen doch kein Problem sein und zum anderen müsste ich dann die vielen vorhandenen Aufrufe von GetString ändern. Das will ich möglichst vermeiden. Besten Dank Ares Dazu soll es noch die Möglichkeit geben der Funktion Argument für die String-Formatierung und |
Re: Funktion Überladen --> Doppeldeutiger überladener Auf
Zitat:
Grüße, Messie |
Re: Funktion Überladen --> Doppeldeutiger überladener Auf
@messie:
tun sie doch auch nicht.
Delphi-Quellcode:
und die beiden anderen Parametersätze sind
// das
ID: Integer; StringOptions: TStringOptions=[]; // enspricht dem und soeinen Parametersatz gibt es noch nicht ID: Integer;
Delphi-Quellcode:
also meiner Meinung nach sollte es eigentlich gehn :gruebel:
ID: Integer; Args: array of TVarRec
ID: Integer; StringOptions: TStringOptions; Args: array of TVarRec
Code:
Integer; [color=#a0a0a0]TStringOptions[/color]
Integer; array_of_TVarRec Integer; TStringOptions; array_of_TVarRec |
Re: Funktion Überladen --> Doppeldeutiger überladener Auf
Aber das erste Argument ist immer ein integer. Das entspricht genau dem, was die OH als abschreckendes Beispiel genannt hat. Woher soll die Funktion wissen, wieviel Speicherplätze mit welcher Speicherstruktur sie beim Aufruf für die Parameter reservieren soll?
Grüße, Messie |
Re: Funktion Überladen --> Doppeldeutiger überladener Auf
Zitat:
Wenn Du bei der dritten Schreibweise den zweiten und dritten Parameter vertauschst, dann könnte es klappen. |
Re: Funktion Überladen --> Doppeldeutiger überladener Auf
Nein, die OH schrieb von
Code:
fällt dir was auf?
procedure Confused([color=red]Integer[/color]);
procedure Confused([color=red]Integer[/color]; [color=silver]Integer=0[/color]); die zweite Prozedur endspricht genau der Ersten, wenn man den optionalen Parameter wegläßt. |
Re: Funktion Überladen --> Doppeldeutiger überladener Auf
Delphi-Quellcode:
Was stellt [] bei GetString(0, []) nun dar? Ein leeres Set oder ein leeres Array?
function GetString(ID: Integer; StringOptions: TStringOptions=[]): String; overload;
function GetString(ID: Integer; Args: array of TVarRec): String; overload; function GetString(ID: Integer; StringOptions: TStringOptions; Args: array of TVarRec): String; overload; |
Re: Funktion Überladen --> Doppeldeutiger überladener Auf
IMHO sollte es so ohne Probleme gehen:
Delphi-Quellcode:
Falls nicht, möge man mich korrigieren.
function GetString(ID: Integer; StringOptions: TStringOptions=[]): String; overload;
function GetString(Args: array of TVarRec; ID: Integer): String; overload; //Argumente getauscht function GetString(ID: Integer; StringOptions: TStringOptions; Args: array of TVarRec): String; overload; |
Re: Funktion Überladen --> Doppeldeutiger überladener Auf
So ähnlich hatte ich das auch schon probiert - also jedesmal ein neuer einleitender Parameter. Gescheitert ist der Compiler daran, daß er laut #1 eine jeweils andere Variante "von sich selbst" aufrufen sollte. Da scheint sogar die Reihenfolge der Deklarationen Einfluss zu haben.
Ein interessantes Thema... Grüße, Messie |
Re: Funktion Überladen --> Doppeldeutiger überladener Auf
Delphi-Quellcode:
Geht das denn so?
function GetString(ID: Integer; StringOptions: TStringOptions=[]): String; overload;
function GetString(ID: Integer; Args: array of TVarRec; StringOptions: TStringOptions = []): String; overload; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz