![]() |
Wie dynamischer Vorfahr für generische Klasse?
Praktisch möchte ich sowas haben,
Delphi-Quellcode:
aber Delphi meint nur
TMyClass<Ancestor: Class> = Class(Ancestor)
* ^^^^^^^^ Zitat:
z.B.
Delphi-Quellcode:
wobei es quasi dem entspricht, nur daß eben meine gen. Klasse hier noch mit dazwischen eingefügt wird.
TTest = Class(TMyClass<TComponent>)
Delphi-Quellcode:
TTest = Class(TComponent)
|
Re: Wie dynamischer Vorfahr für generische Klasse?
Ich fürchte, da wirst du zur Zeit kein Glück haben. Mach dafür doch ein Feature-Request in QC auf.
Eventuell kannst du das aber mit Aggregation oder einem Decorator lösen. |
Re: Wie dynamischer Vorfahr für generische Klasse?
Nee, andere Wege helfen hier leider nichts,
denn wenn z.B. TMyClass direkt von TObject abgeleitet ist (alles Andere wäre Aufgrund des "unbekannten" Basistyps nicht sinvoll), dann hätte auch TTest nur TObject als Vorfahre und wäre dann, laut dem Beispiel, nicht mit TComponent kompatibel und somit kann man diese Klasse auch nicht als "Komponente" einsetzen. |
Re: Wie dynamischer Vorfahr für generische Klasse?
Zitat:
Ich kann mir nicht so richtig vorstellen, welche Funktionalität auf beliebige Klassen vererbt werden soll. Welche Funktionalität ist so allgemein nützlich, dass man sie im Prinzip in jeder Klasse brauchen kann? (etwa Logging oder Persistenz der Objektdaten?) |
Re: Wie dynamischer Vorfahr für generische Klasse?
Man kann auch Typschranken für Generics angeben, das müsste dann aber so aussehen
Delphi-Quellcode:
Das legt fest, dass alle Klassen mit denen du deinen generische Klasse initialisierst vom Typ TAncester oder eine davon abgeleitete Klasse sein muss.
TMyClass<A:TAncestor> = Class(TAncestor)
Wenn du class als Schranke angibst kannste du das auch gleich weglassen. Zitat:
EDIT: Aber andereseits, wenn du nur Funktionalität für Klassen die von der Klasse selbst abgeleietet sind anbieten möchtest brauchst du doch garkeine generics, da ein Obertyp der Klasse bekannst ist und die dynamische Bindung den Rest erledigen sollte. |
Re: Wie dynamischer Vorfahr für generische Klasse?
Neee, det "Basistyp ist eben hier noch nicht festgelegt, dieser ist in der generischen Klasse noch unbekannt und wird erst in der Ableitung entschieden.
Ich wollte auf diese Weise eine allgemeine Verwaltung einer verketteten Liste implementieren. Bei dieser Verwaltung ist der "Basistyp" unwichtig. Das : Class soll nur sicherstellen, daß dort nur irgendeine Klasse angegeben werden kann, aber welche Klasse das nun sein soll, ist ja nicht wichtig. |
Re: Wie dynamischer Vorfahr für generische Klasse?
Und was spricht gegen sowas?
Delphi-Quellcode:
type
TListNode<T> = class private FData: T; FNext: TListNode<T>; FPrev: TListNode<T>; public property Data: T read FData write FData; property Next: TListNode<T> read FNext write FNext; property Prev: TListNode<T> read FPrev write FPrev; end; |
Re: Wie dynamischer Vorfahr für generische Klasse?
@Uwe:
Delphi-Quellcode:
Das ist halt mein Problem.
var X: TListNode<TStringList>;
if X is TStringList then // geht nicht, da keine Stringliste Ich möchte den Basistypen ändern und nicht irgendeinen inneren Typen und dafür muß man den Basistypen von TListNode ändern.
Delphi-Quellcode:
TListNode<T> = class(Basistyp)
|
Re: Wie dynamischer Vorfahr für generische Klasse?
Schaut wie
![]() |
Re: Wie dynamischer Vorfahr für generische Klasse?
Zitat:
Delphi-Quellcode:
if X.Data is TStringList then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 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