![]() |
Delphi-Version: 2009
Objekte aus generischem Typ erstellen
Hallo,
Mir ist leider kein besserer Titel eingefallen. Es geht darum, dass ich eine "Normale" und eine generische Klasse habe. Das ganze sieht erstmal so aus:
Delphi-Quellcode:
Jetzt will ich in TKlasseB<T>.EineMethode() dynamisch ein Objekt vom Typ T erstellen.
TKlasseA = class
constructor Create(AParam: TObject); end; TKlasseB<T: TKlasseA> = class procedure EineMethode; end;
Delphi-Quellcode:
Der Compiler meckert:
procedure TKlasseB<T>.EineMethode;
var X: TObject; begin X := T.Create(Self); end; Zitat:
Delphi-Quellcode:
Dann kann ich nur den parameterlosen (TObject-)Konstruktor aufrufen:
TKlasseB<T: constructor, TKlasseA> = class
procedure EineMethode; end;
Delphi-Quellcode:
X := T.Create(Self);
Zitat:
Delphi-Quellcode:
Das kompiliert jetzt zwar, aber ich erhalte beim Aufrufen des Konstruktors eine Zugriffsverletzung.
TKlasseA = class
constructor Create(AParam: TObject); end; TKlasseAClass = class of TKlasseA; TKlasseB<T: TKlasseA> = class procedure EineMethode; end; procedure TKlasseB<T>.EineMethode; var Typ: TKlasseAClass; X: TObject; begin Typ := TKlasseAClass(T.ClassType); X := Typ.Create(Self); end; Ich glaube dass in "Typ" irgendwie keine gültige Klasse drin steht... Weiß jemand was ich machen kann? Gruß Neutral General |
AW: Objekte aus generischem Typ erstellen
Delphi-Quellcode:
procedure TKlasseB<T>.EineMethode;
var X: TObject; begin X := TKlasseA(T).Create(Self); end; |
AW: Objekte aus generischem Typ erstellen
Hallo,
Wenns immer TKlasseA wäre/sein soll, dann wärs ja kein Problem :roll: Geht ja darum, dass T ja auch jede von TKlasseA abgeleitete Klasse sein kann! Seltsamerweise funktioniert folgendes:
Delphi-Quellcode:
Das ist jetzt aber keine wirklich schöne/saubere Lösung finde ich.
procedure TKlasseB<T>.EineMethode;
var Typ: TKlasseAClass; tmp: T; X: TObject; begin tmp := T.Create; try Typ := TKlasseAClass(tmp.ClassType); finally tmp.Free; end; X := Typ.Create(Self); end; Also wenn jemand eine Lösung hat in der man kein temporäres Objekt erstellen/freigeben muss, dann wäre mir das deutlich lieber! |
AW: Objekte aus generischem Typ erstellen
Geht es, einen 2. abstrakten Konstruktor zu basteln, also so:
Delphi-Quellcode:
Den müsste dann jede von KlasseA abgeleitete klasse überschreiben:
constructor Create2; virtual; abstract;
Delphi-Quellcode:
constructor TVonKlasseAabgeleitet.Create2();
begin TVonKlasseAabgeleitet.Create; //bzw: self.ClassType.Create;?? end; |
AW: Objekte aus generischem Typ erstellen
Delphi-Quellcode:
uses TypInfo;
procedure TKlasseB<T>.EineMethode; var Typ: TKlasseAClass; tmp: T; begin Typ:= TKlasseAClass(T).ClassType; tmp:= Typ.Create(self); end; |
AW: Objekte aus generischem Typ erstellen
Es gibt bei den Generics leider keine Einschränkungen, wo man etws auf eine bestimmte Klasse (eventuell inklusive Nachfahren) beschränken kann.
Was man maximal sagen kann ist, daß es irgendeine eine Klasse ein soll. |
AW: Objekte aus generischem Typ erstellen
Zitat:
:arrow: Es funktioniert so leider nicht. Zitat:
Delphi-Quellcode:
Und dann meckert der Compiler, wenn man versucht eine TGeneric-Variable mit einem Typ T zu deklarieren, der nicht von TForm erbt. Man kann dann auch eigentlich in Methoden von TGeneric auf die Methoden von TForm zugreifen bei T-Objekten.
TGeneric<T: TForm> = class
end; Das allgemeine ist:
Delphi-Quellcode:
Gruß
TGeneric<T: class> = class
end; Neutral General |
AW: Objekte aus generischem Typ erstellen
Sicher?
Also im 2010er war mir, als wenn es nicht ging, als ich sowas versuchte ... oder war's noch im 2009er :gruebel: Zitat:
|
AW: Objekte aus generischem Typ erstellen
Doch das geht.
Das geht/ging von Anfang an. Ich benutze das hier mit Delphi 2009 ;) Edit: Ok, auf das Objekt zugreifen (T.Caption := 'Test123') funktioniert nicht: Zitat:
Wies mit Delphi2010/XE ist kann ich momentan nicht sagen weil ich hier grad nur Delphi 2009 hab. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:57 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 by Thomas Breitkreuz