Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie dynamischer Vorfahr für generische Klasse? (https://www.delphipraxis.net/149136-wie-dynamischer-vorfahr-fuer-generische-klasse.html)

himitsu 15. Mär 2010 10:42


Wie dynamischer Vorfahr für generische Klasse?
 
Praktisch möchte ich sowas haben,
Delphi-Quellcode:
TMyClass<Ancestor: Class> = Class(Ancestor)
*                                 ^^^^^^^^
aber Delphi meint nur
Zitat:

[DCC Fehler] ...: E2021 Klassentyp erwartet
Denn diese Klasse soll selber nur eine gewisse Funktionalität für andere, davon abgeleitete Klassen bereitstellen, aber ich wollte den anderen Klassen nicht die Möglichkeit nehmen, jeweil einen "anderen" Vorfahren zu nutzen.


z.B.
Delphi-Quellcode:
TTest = Class(TMyClass<TComponent>)
wobei es quasi dem entspricht, nur daß eben meine gen. Klasse hier noch mit dazwischen eingefügt wird.
Delphi-Quellcode:
TTest = Class(TComponent)

Uwe Raabe 15. Mär 2010 10:48

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.

himitsu 15. Mär 2010 11:06

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.

shmia 15. Mär 2010 11:30

Re: Wie dynamischer Vorfahr für generische Klasse?
 
Zitat:

Zitat von himitsu
Denn diese Klasse soll selber nur eine gewisse Funktionalität für andere, davon abgeleitete Klassen bereitstellen...

Was wäre das konkret?
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?)

HERMES 15. Mär 2010 11:30

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:
TMyClass<A:TAncestor> = Class(TAncestor)
Das legt fest, dass alle Klassen mit denen du deinen generische Klasse initialisierst vom Typ TAncester oder eine davon abgeleitete Klasse sein muss.

Wenn du class als Schranke angibst kannste du das auch gleich weglassen.


Zitat:

Denn diese Klasse soll selber nur eine gewisse Funktionalität für andere, davon abgeleitete Klassen bereitstellen, aber ich wollte den anderen Klassen nicht die Möglichkeit nehmen, jeweil einen "anderen" Vorfahren zu nutzen.
Ich weis nicht ob ich dich richtig verstanden habe, aber du hast doch dann immer noch das "Problem", dass du TAncester statisch angeben musst.

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.

himitsu 15. Mär 2010 11:39

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.

Uwe Raabe 15. Mär 2010 11:47

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;

himitsu 15. Mär 2010 12:05

Re: Wie dynamischer Vorfahr für generische Klasse?
 
@Uwe:
Delphi-Quellcode:
var X: TListNode<TStringList>;

if X is TStringList then // geht nicht, da keine Stringliste
Das ist halt mein Problem.
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)

uligerhardt 15. Mär 2010 12:11

Re: Wie dynamischer Vorfahr für generische Klasse?
 
Schaut wie das hier aus. ;)

Uwe Raabe 15. Mär 2010 12:13

Re: Wie dynamischer Vorfahr für generische Klasse?
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
var X: TListNode<TStringList>;

if X is TStringList then // geht nicht, da keine Stringliste

Klar, aber dann schreib doch einfach

Delphi-Quellcode:
if X.Data is TStringList then


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz