AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Funktion Überladen --> Doppeldeutiger überladener Aufruf
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion Überladen --> Doppeldeutiger überladener Aufruf

Ein Thema von Ares · begonnen am 16. Nov 2007 · letzter Beitrag vom 3. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
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
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 14:27
Zitat von OH:
If you use default parameter values in an overloaded routine, avoid ambiguous parameter signatures. Consider, for example, the following.

Delphi-Quellcode:
procedure Confused(I: Integer); overload;

 ...
procedure Confused(I: Integer; J: Integer = 0); overload;
 ...
Confused(X); // Which procedure is called?
In fact, neither procedure is called. This code generates a compilation error.
Die Parametersätze in den unterschiedlichen Deklarationen dürfen nicht übereinstimmen, was in Deinem Fall aber mehrfach so ist. Das ist mit der Doppeldeutigkeit gemeint.

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#3

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 14:34
@messie:
tun sie doch auch nicht.

Delphi-Quellcode:
// das
ID: Integer; StringOptions: TStringOptions=[];
// enspricht dem und soeinen Parametersatz gibt es noch nicht
ID: Integer;
und die beiden anderen Parametersätze sind
Delphi-Quellcode:
ID: Integer; Args: array of TVarRec
ID: Integer; StringOptions: TStringOptions; Args: array of TVarRec
also meiner Meinung nach sollte es eigentlich gehn
Code:
Integer; [color=#a0a0a0]TStringOptions[/color]
Integer; array_of_TVarRec
Integer; TStringOptions; array_of_TVarRec
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 15:03
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
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 15:17
Zitat von himitsu:

Delphi-Quellcode:
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;
Das funktioniert so auch nicht.
Wenn Du bei der dritten Schreibweise den zweiten und dritten Parameter vertauschst, dann könnte es klappen.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#6

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 15:27
Nein, die OH schrieb von

Code:
procedure Confused([color=red]Integer[/color]);
procedure Confused([color=red]Integer[/color]; [color=silver]Integer=0[/color]);
fällt dir was auf?

die zweite Prozedur endspricht genau der Ersten, wenn man den optionalen Parameter wegläßt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#7

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 15:31
Delphi-Quellcode:
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;
Was stellt [] bei GetString(0, []) nun dar? Ein leeres Set oder ein leeres Array?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 15:41
IMHO sollte es so ohne Probleme gehen:
Delphi-Quellcode:
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;
Falls nicht, möge man mich korrigieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 22:23
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
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#10

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 22:25
Delphi-Quellcode:
function GetString(ID: Integer; StringOptions: TStringOptions=[]): String; overload;
function GetString(ID: Integer; Args: array of TVarRec; StringOptions: TStringOptions = []): String; overload;
Geht das denn so?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz