![]() |
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:
Danach sollte Gelb als TGelb initialisiert und Rot als TRot initialisiert worden sein. Funktioniert aber leider nicht... habe ich etwas grundlegendes falsch verstanden?
var
Gelb: TGelb; Rot: TRot; begin Main := TMain.Create; Main.LoadObject<RGelb>(Gelb); Main.LoadObject<TRot>(Rot) end; Martin |
AW: Generics als Parameter in Methode
Mach mal nen var Parameter draus
|
AW: Generics als Parameter in Methode
Delphi-Quellcode:
procedure TMain.LoadObject<T: class, constructor>(out aObject: T);
|
AW: Generics als Parameter in Methode
In beiden Fällen kommt die Meldung:
Code:
in der Zeile
[DCC Fehler] uObjCore.pas(1685): E2568 Neue Instanz kann ohne CONSTRUCTOR-Einschränkung in der Typparameterdeklaration nicht erstellt werden
Code:
:|
aObject := T.Create;
Es scheint in die Richtung zu gehen: ![]() |
AW: Generics als Parameter in Methode
Die Fehlermeldung klingt doch ziemlich konkret. Definiere TMain mal als:
Code:
Mit dem zusätzlichen Constraint auf constructor sollte es gehen.
type
TMain = class (Tobject) private procedure LoadObject<T: class, constructor>(aObject: T); end; Edit: Genau diese Lösung steht doch auch in der Wiki-Page die du verlinkt hast... |
AW: Generics als Parameter in Methode
Danke, wollte ich auch gerade posten :wink:
Danke für eure Hilfe! |
AW: Generics als Parameter in Methode
Zitat:
Oder der ganz normale und überall übliche Weg, ohne Generics.
Delphi-Quellcode:
Ich vermute auch, das es, ohne eine virtuellen Contructor, selbst bei den Generics nicht funktionieren wird.
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); 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 20:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz