Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Überladene Funktion wird nicht erkannt (https://www.delphipraxis.net/173483-ueberladene-funktion-wird-nicht-erkannt.html)

BlackSeven 27. Feb 2013 14:59

Überladene Funktion wird nicht erkannt
 
Hallo!

Folgender Code schlägt mit dem Compiler-Error "[DCC Error] Task.dpr(46): E2250 There is no overloaded version of 'CreateTask' that can be called with these arguments" fehl:
Delphi-Quellcode:
program Task;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type

  ITask = interface
    ['{45C4232F-EA00-4096-88F9-6DD78AD0CB0C}']
  end;

  TAdapterTask = class(TInterfacedObject, ITask)
  end;

  TTask = class(TAdapterTask)
  end;

  TTaskDelegate = reference to procedure(const ATask: ITask);

  TTestTask = class(TTask)
  end;

  Threading = class
  public
    class function CreateTask(const ATask: ITask): ITask; overload;
    class function CreateTask(const ATask: TTaskDelegate): ITask; overload;
  end;

class function Threading.CreateTask(const ATask: ITask): ITask;
begin
end;

class function Threading.CreateTask(const ATask: TTaskDelegate): ITask;
begin
end;

var
  T: ITask;

begin

//  T := TTestTask.Create;
  Threading.CreateTask(TTestTask.Create);

end.
Eigentlich wollte ich mir die Zeile mit "T := TTestTask.Create;" sparen und eine neue Funktion einführen.
Kommentiere ich die 2. Funktion "CreateTask(const ATask: TTaskDelegate)" aus, funktioniert es wie erwartet.

Gibt es einen Workaround, um das ganze Problem zu umgehen?

Thom 27. Feb 2013 15:11

AW: Überladene Funktion wird nicht erkannt
 
Delphi-Quellcode:
Threading.CreateTask(TTestTask.Create as ITask);


P.S.:
Anonyme Methoden basieren intern ebenfalls auf TInterfacedObject und werden deshalb als Interface behandelt. Deshalb muß in Deinem Fall der Compiler etwas unterstützt werden, indem ihm gesagt wird, welches Interface und damit welche Methode gemeint ist.

BlackSeven 27. Feb 2013 15:42

AW: Überladene Funktion wird nicht erkannt
 
Zitat:

Zitat von Thom (Beitrag 1205280)
P.S.:
Anonyme Methoden basieren intern ebenfalls auf TInterfacedObject und werden deshalb als Interface behandelt.

Das ist mir bekannt. Ich dachte, der Compiler wäre so schlau, und würde hier eine Unterscheidung machen.
Wenn nicht, dann müsste die Fehlermeldung "E2251: Ambiguous overloaded call to '%s'..." kommen.

Trotzdem danke!

Thom 27. Feb 2013 16:02

AW: Überladene Funktion wird nicht erkannt
 
Zitat:

Trotzdem danke!
Gern geschehen. Ich kann aber nichts dafür - ich habe den Compiler nicht geschrieben... :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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