Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Overload function (https://www.delphipraxis.net/177681-overload-function.html)

RWarnecke 20. Nov 2013 16:52


Overload function
 
Hallo zusammen,

ich sehe gerade den Wald vor lauter Bäumen nicht mehr. Wo mache ich in diesem Beispiel den Fehler ?
Delphi-Quellcode:
THauptklasse = class(TComponent)
private
public
    function Post(const Msg, Link, Image: string): string; overload;
    function Post(const Msg, Link, Image: string; Page: TPage): string; overload;
    function Post(const Msg, Link, Image: string; Group: TGroup): string; overload;
published
end;

{...}

function THauptklasse.Post(const Msg, Link, Image: string): string;
begin
  Post(Msg, Link, Image, nil); //<<--- Fehler
end;

function THauptklasse.Post(const Msg, Link, Image: string; Page: TPage): string;
begin
  { To do something }
end;

function THauptklasse.Post(const Msg, Link, Image: string; Group: TGroup): string;
begin
  { To do something }
end;
Die beiden Klassen TPage und TGroup sind von TPersistent abgeleitet.

Wenn ich jetzt kompiliere bekomme ich den Fehler:
Zitat:

[dcc32 Error] Testklassen.pas(842): E2251 Ambiguous overloaded call to 'Post'
Nehme ich jetzt eine der beiden Funktionen mit TPage oder TGroup raus ist der Fehler weg.

Sir Rufo 20. Nov 2013 16:55

AW: Overload function
 
Wie soll der Compiler bei
Delphi-Quellcode:
nil
denn auflösen, welche Methode er nehmen soll? :stupid:

PS: Das ist mit Ambiguous gemeint ;)

RWarnecke 20. Nov 2013 17:02

AW: Overload function
 
Ok, leuchtet ein bisschen ein. Nur was müsste ich machen, dass er bei nil oder bei einer TPage-Klasse immer die Funktion mit TPage nimmt und wenn ich beim Aufruf ein TGroup angebe soll er die andere Funktion nehmen ?

Oder kann ich das gar nicht über eine überladene Funktion regeln ? Ich tue mich immer noch schwer damit.

mkinzler 20. Nov 2013 17:15

AW: Overload function
 
Überrgib eine typisierte Konstante

RWarnecke 20. Nov 2013 17:22

AW: Overload function
 
Wie sollen mir hier typisierte Konstanten weiterhelfen ? Könntest Du das bitte ein bisschen ausführlicher erklären.

himitsu 20. Nov 2013 17:26

AW: Overload function
 
Na wenn das typisiert ist, dann weiß der Compiler ja, daß es TPage sein soll. :zwinker:

Oder typisiere das Nil.
Delphi-Quellcode:
Post(Msg, Link, Image, TPage(nil));


Oder deklariere die Überladungen so, daß es keine derartigen Probleme gibt.


Bei TPage nimmt er ja schon TPage, aber NIL passt nunmal auch zu TGroup, also kann man es nirgends sicher zuordnen.

daywalker9 20. Nov 2013 17:46

AW: Overload function
 
Delphi-Quellcode:
Default(TPage)
als Parameter sollte auch gehen in neueren delphi Versionen.

RWarnecke 20. Nov 2013 18:35

AW: Overload function
 
Hallo zusammen,

ich bedanke mich erstmal für die zahlreichen Antworten. Ich glaube so langsam kapiere ich es. Das Thema ist nicht gerade mein Steckenpferd. Die Variante von himitsu kann ich jetzt ohne Fehler kompilieren. Das hilft mir erstmal weiter, Danke.

himitsu 20. Nov 2013 18:44

AW: Overload function
 
Zitat:

Zitat von RWarnecke (Beitrag 1236788)
Die Variante von himitsu kann ich jetzt ohne Fehler kompilieren.

Das ist im Prinzip die selbe Variante, wie von mkinzler beschrieben,
nur eben mit einer impliziten Konstante.

Delphi-Quellcode:
const
  NoPage: TPage = nil;

Post(Msg, Link, Image, NoPage);
Das Default nutze ich eher für das, wo es her kommt, also in einer generischen Methode.
Denn so ist es ein bissl ungewohnt und nicht direkt als 0/nil zu erkennen.

Furtbichler 20. Nov 2013 19:06

AW: Overload function
 
Andere Idee:
Was ist eigentlich so toll an überladenen Funktionen?
Wieso nicht einfach:
Delphi-Quellcode:
THauptklasse = class(TComponent)
private
public
     function Post(const Msg, Link, Image: string): string; overload;
     function PostPage(const Msg, Link, Image: string; Page: TPage): string;
     function PostGroup(const Msg, Link, Image: string; Group: TGroup): string;
published
end;
Ist für mich mindestens genauso verständlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.
Seite 1 von 4  1 23     Letzte »    

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