![]() |
Re: Wie dynamischer Vorfahr für generische Klasse?
Zitat:
Delphi-Quellcode:
Und sag jetzt nicht,
procedure Proc(SL: TStrings);
begin end; var X: TListNode<TStringList>; Proc(X); // geht auch nicht, da keine Stringliste Zitat:
Außerdem finde ich es mit den .data im Code dann etwas unübersichtlich/umständlich. |
Re: Wie dynamischer Vorfahr für generische Klasse?
Ich frag mich gerade, wie die Implementierung deiner Klasse aussehen soll, wenn du dort nichtmal weißt, wovon sie abgeleitet ist. Dazu müsstest du doch zumindest einen Constraint angeben, oder nicht?
|
Re: Wie dynamischer Vorfahr für generische Klasse?
Zitat:
|
Re: Wie dynamischer Vorfahr für generische Klasse?
Wenn du sagst, deine Basisklasse ist nicht bekannt, dann meist du damit, dass diese auch eine generische Klasse ist? Oder wie istdas sonst zu verstehen
Zitat:
Delphi-Quellcode:
oder allgemeiner
procedure Proc(SL: TListNode<TStringList>);
begin end; var X: TListNode<TStringList>; Proc(X); // geht auch nicht, da keine Stringliste
Delphi-Quellcode:
procedure Proc(SL: TListNode<Y>);
begin end; var X: TListNode<TStringList>; Proc(X); // geht auch nicht, da keine Stringliste |
Re: Wie dynamischer Vorfahr für generische Klasse?
Zitat:
Delphi-Quellcode:
Welche Gemeinsamkeiten hätte denn TMyClass<TForm> mit TMyClass<TFoo> (bewusst nicht definierte Klasse gewählt) außer, dass beide explizit auf mindestens TMyClass<TObject> umgecastet werden könnten? Beziehungsweise, wozu muss der Typparameter der Vorfahr der Klasse sein? Nur, damit du ein Object davon an eine Methode übergeben kannst, die TForm bzw TFoo akzeptiert? Das geht auch anders.
TMyClass<Ancestor: class> = class(Ancestor)
|
Re: Wie dynamischer Vorfahr für generische Klasse?
Zitat:
Was Du haben willst sind Interfaces. Und um Methoden zur Verfügung zu stellen benutzt Du dann Extension Methods (Class helper) auf diesem Interface. Somit können alle von ihrer gewünschten Basisklasse ableiten, das Interface implementieren (das kann auch einfach leer sein, wenn es nur um Methoden geht) und aufgerufen werde diese Methoden über die Class helper auf dem Interface. |
Re: Wie dynamischer Vorfahr für generische Klasse?
Zitat:
Nja, ich hab mir hier halt ein Problem geschaffen und versuche dafür nun eine "nette" Lösung zu finden. Nja, ich werde noch etwas rumspielen ... mal sehn, vielleicht finde ich ja noch eine andere Lösung, außer dem Interface. Ich spiele grad so ein bissl rum und probiere mehreres aus. So war ich erstmal bei den "kleineren" Records gelandet, aber so wie es aussieht, werde ich wohl oder übel auf Klassen umsteigen müssen, weswegen ich dann auf das oben genannte "Problem" gekommen bin.
Delphi-Quellcode:
Allerdings geht auch das nicht, obwohl hier Typ ja bekannt wäre.
PMyRec = ^TMyRec<Typ: record>; // <<< geht natürlich nicht
// aber das war ja klar TMyRec<Typ: Record> = record type PTyp = ^Typ; // <<< geht {...} end;
Delphi-Quellcode:
Wie soll man da einen Pointer deklarieren, welchen auch der generische Teil kennt?
TMyRec<Typ: record> = record
type PMyRec = ^TMyRec<Typ>; // <<< geht nicht PTyp = ^Typ; // <<< geht {...} end; OK, außer man macht es umständlicher extern, welches aber nicht unbedingt eine "fehlerunanfälligere" Deklaration erfordert.
Delphi-Quellcode:
Und da Records keine Vererbung kennen, kann man hier ja keinen genaueren Typen festlegen, welcher dann ein "Value" kennt:
TMyRec<Typ: record; PRec> = record
type PMyRec = PRec; PTyp = ^Typ; {...} end; PTest = ^TTest; TTest = TMyRec<Integer, PTest>;
Delphi-Quellcode:
Selbst wenn sichergestellt ist, daß der Record "Typ" einen Wert "Value" besietzt, geht dieses nicht,
TMyRec<Typ: record> = record
x: Typ; function Test: Integer; end; function TMyRec<Typ>.Test: Integer; begin Result := X.Value; // <<< geht nicht end; da der Compiler dennoch meckert, daß "Value" nicht bekannt sei. [add] Und Generics für Helper gehn leider auch nicht.
Delphi-Quellcode:
TMyRec<Typ: Record> = Record Helper for Typ
... end; TMyCls<Typ: Class> = Class Helper for Typ ... end; |
Re: Wie dynamischer Vorfahr für generische Klasse?
Wieso bist Du so auf Generics versessen?
Die haben zwar ihre Daseinsberechtigung, sind aber kein Allheilmittel. Was willst Du denn eigentlich *genau* machen bzw. welches Problem hast Du Dir geschaffen was Du 'nett' Lösen willst? Vielleicht finden wir einen anderen / besseren Lösungsansatz der nicht das vergewaltigen von Sprachkonstrukten zum Inhalt hat? ;-) |
Re: Wie dynamischer Vorfahr für generische Klasse?
Zitat:
und "neue" Dinge müssen gründlich ausprobiert werden. Ja, und ich suche gern die Grenze des Möglichen und wenn möglich überschreite ich sie gerne mal. Wenn es nicht klappt, dann geht's halt nicht und ich löse es anders/normal. :angel2: Die Verwaltung einer mehrfach verketteten Liste ist ja nicht unbedingt sooooo einfach. Für sowas hab ich jetzt erstmal ein Template, welches man verwenden/anpassen könnte. Nun wollte ich das Ganze aber mal versuchen generisch zu lösen, so daß man es direkt einbinden und ohne Änderung verwenden könnte. |
Re: Wie dynamischer Vorfahr für generische Klasse?
Ist nur meine Meinung, aber ich halte es für keine gute Idee, die strukturelle Verknüpfung von Objekten in die Klassen zu verlagern. Das schränkt die Verwendbarkeit m.E. zu stark ein.
Beispiel: Nehmen wir die Klasse TStringList und leiten daraus einen TStringListNode ab, der dann für die verkettete Liste zuständig ist. Natürlich kann ich jetzt sowas wie Node is TStringList abfragen, aber was ist mit einer von TStringList abgeleiteten Klasse (z.B. TExtendedStringList)? Diese müsste eine neue Node-Ableitung bekommen TExtendedStringListNode. Das könnte wohl auch der Anlass zu deiner Frage gewesen sein. Nehmen wir nun mal an, es gäbe diesen Node-Generic. Nun brauchst du aber die Objekte nicht in einer verketten Liste, sondern in einer Baumstruktur. Geht aber nicht, weil du nicht einfach aus den ListNode-Instanzen TreeNode-Instanzen machen kannst. Wenn du die Struktur-Elemente aus den Klassen heraus hälst, gewinnst du wesentlich mehr Spielraum (Playboy!). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 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