Einzelnen Beitrag anzeigen

Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

Funktion Überladen --> Doppeldeutiger überladener Aufruf

  Alt 16. Nov 2007, 11:34
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:
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;
Mit dieser Definition sollten eigentlich folgende Aufrufe der Funktion möglich sein:
Delphi-Quellcode:
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']);
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?

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
  Mit Zitat antworten Zitat