![]() |
Generics mit abgeleiten Klassen
Hallo zusammen,
ich probiere mich heute das erste mal an Generics und habe irgendwie ein Verständnisproblem. Ich habe eine Basisklasse und davon eine Ableitung. Jetzt möchte ich, dass meine Generic Klasse entweder die Basisklasse nimmt, oder die Ableitung.
Code:
Es knallt an der Stelle
unit MyClass;
interface type TMyBase = class private FBaseProperty: Integer; public property BaseProperty: Integer read FBaseProperty write FBaseProperty; end; TMyExtended = class(TMyBase) private FExtendedProperty: Integer; public property ExtendedProperty: Integer read FExtendedProperty write FExtendedProperty; end; TMyGeneric<T: TMyBase>=class private FMyItem: T; public constructor Create; property MyItem: T read FMyItem; end; TMyBaseClass = TMyGeneric<TMyBase>; TMyExtendedClass = TMyGeneric<TMyExtended>; var vMyBaseItem: TMyBaseClass; vMyExtendedItem: TMyExtendedClass; implementation { TMyGeneric<T> } constructor TMyGeneric<T>.Create; begin inherited; FMyItem := TMyBase(T).Create; end; end.
Code:
E2010 Inkompatible Typen: 'TMyExtended' und 'TMyBase'
TMyExtendedClass = TMyGeneric<TMyExtended>;
Was mache ich denn falsch? |
AW: Generics mit abgeleiten Klassen
Der Fehler liegt im Constructor. Dort wird einer Variablen vom Type T (= TMyExtended) ein TMyBase zugewiesen.
|
AW: Generics mit abgeleiten Klassen
Ich hasse Delphi, wenn es nicht sagt in welcher Zeile der Fehler ist,
ABER Du hast recht, wenn ich die Zeile auskommentiere gehts... OK, wie ist der Aufruf denn richtig? Vielen Dank schonmal für die schnelle Hilfe ... |
AW: Generics mit abgeleiten Klassen
Versuch mal
Delphi-Quellcode:
.
FMyItem := T.Create;
Entweder mußt du T.Crete schreiben oder das FMyItem nochmal nach TMyBase casten, vor der Zuweisung. (gibt halt ein paar kleine Bugs in diesen Generics :roll:) |
AW: Generics mit abgeleiten Klassen
Hallo,
klappt leider beides nicht. Ich bekomm einen Fehlert und stehe auf T.Create Meldung: Neue Instanz kann ohne CONSTRUCTOR-Einschränkung in der Typparameterdeklaration nicht erstellt werden |
AW: Generics mit abgeleiten Klassen
Laut Warnung will der Compiler sowas haben:
Delphi-Quellcode:
.
TMyGeneric<T: constructor>=class
k.A. ob man diese beiden Beschränkgen kombinieren kann, Schön, daß man im XE jetzt auch direkt Typen angeben kann, aber so richtig funktioniert es dann wohl doch noch nicht. :roll: |
AW: Generics mit abgeleiten Klassen
Delphi-Quellcode:
Geschickterweise macht man das type TMyGeneric<T: constructor, TMyBase> = class private FMyItem: T; public constructor Create; property MyItem: T read FMyItem; end; constructor TMyGeneric<T>.Create; begin inherited; FMyItem := T.Create; end;
Delphi-Quellcode:
dann auch noch
TMyBase.Create
Delphi-Quellcode:
.
virtual
|
AW: Generics mit abgeleiten Klassen
Hat geklappt,
vielen Dank für die schnelle Hilfe, also da muss man erstmal drauf kommen. Wo steht sowas? |
AW: Generics mit abgeleiten Klassen
Von C# aus gesehen (von denen Emba wohl hier ein wenig abschreibt) ist das ein wenig logischer.
Und Metaklassen und Konstruktoren sind schon ein Thema für sich. Unterm Strich: Man muss es einfach wissen oder jemanden kennen, der es weiss. |
AW: Generics mit abgeleiten Klassen
Wenn alles irgendwo stehen würde, bräuchtma doch die DP nich ;)
Mir fällt gerade auf... jetzt stehts hier! :thumb: Aber mal Spaß beiseite: gerade was die neuen Features wie Generics, RTTI, anonyme Methoden und so Zeugs angeht gibt es keine lückenlose Dokumentation. Da ist man am besten beraten, bestimmte Blogs zu verfolgen und Google und/oder die DP zu Rate zu ziehen. Auch Marco Cantus Delphi Handbücher enthalten einiges an Wissen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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