Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Generics als Parameter in Methode (https://www.delphipraxis.net/167147-generics-als-parameter-methode.html)

Martin W 15. Mär 2012 12:32

Delphi-Version: XE

Generics als Parameter in Methode
 
Hallo,

folgendes Problem:

Code:
type
  TRot = class (TObject)
  end;

type
  TBlau = class (TObject)
  end;

type
  TGelb = class (TObject)
  end;

ctype
  TMain = class (Tobject)
  private
    procedure LoadObject<T: class>(aObject: T);
  end;

procedure TMain.LoadObject<T>(aObject: T);
begin
    aObject := T.Create;
end;

var
  Main: TMain;

Aufruf:

Code:
var
  Gelb: TGelb;
  Rot: TRot;
begin
  Main := TMain.Create;
  Main.LoadObject<RGelb>(Gelb);
  Main.LoadObject<TRot>(Rot)
end;
Danach sollte Gelb als TGelb initialisiert und Rot als TRot initialisiert worden sein. Funktioniert aber leider nicht... habe ich etwas grundlegendes falsch verstanden?

Martin

Stevie 15. Mär 2012 12:42

AW: Generics als Parameter in Methode
 
Mach mal nen var Parameter draus

Panthrax 15. Mär 2012 12:58

AW: Generics als Parameter in Methode
 
Delphi-Quellcode:
procedure TMain.LoadObject<T: class, constructor>(out aObject: T);

Martin W 15. Mär 2012 13:25

AW: Generics als Parameter in Methode
 
In beiden Fällen kommt die Meldung:

Code:
[DCC Fehler] uObjCore.pas(1685): E2568 Neue Instanz kann ohne CONSTRUCTOR-Einschränkung in der Typparameterdeklaration nicht erstellt werden
in der Zeile

Code:
aObject := T.Create;
:|

Es scheint in die Richtung zu gehen:

http://docwiki.embarcadero.com/RADSt...n_%28Delphi%29

Codewalker 15. Mär 2012 13:29

AW: Generics als Parameter in Methode
 
Die Fehlermeldung klingt doch ziemlich konkret. Definiere TMain mal als:
Code:
type
  TMain = class (Tobject)
  private
    procedure LoadObject<T: class, constructor>(aObject: T);
  end;
Mit dem zusätzlichen Constraint auf constructor sollte es gehen.

Edit: Genau diese Lösung steht doch auch in der Wiki-Page die du verlinkt hast...

Martin W 15. Mär 2012 13:32

AW: Generics als Parameter in Methode
 
Danke, wollte ich auch gerade posten :wink:

Danke für eure Hilfe!

himitsu 15. Mär 2012 14:18

AW: Generics als Parameter in Methode
 
Zitat:

Delphi-Quellcode:
procedure TMain.LoadObject<T>(aObject: T);
begin
    aObject := T.Create;
end;

Wie gesagt, ohne Var/Out-Parameter, oder als als Funktion, ist das nicht wirklich funktionsfähig.



Oder der ganz normale und überall übliche Weg, ohne Generics.
Delphi-Quellcode:
type
  TBasisClass = class of TBasis;
  TBasis = class
    constructor Create; virtual; // eventuell auch noch abstract
  end;

  TRot = class(TBasis)
  end;

function TMain.CreateObject(T: TBasisClass);
begin
  Result := T.Create;
end;

X := TMain.CreateObject(TRot);
Ich vermute auch, das es, ohne eine virtuellen Contructor, selbst bei den Generics nicht funktionieren wird.
OK, oder man sucht sich über die neu/erweiterte RTTI den entsprechenden Constructor raus und nutzt Diesen.


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