Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Von TObjectList<T> erben? (https://www.delphipraxis.net/147808-von-tobjectlist-t-erben.html)

ryLIX 16. Feb 2010 21:55


Von TObjectList<T> erben?
 
Ich würde gerne meine angepasste Objektliste auf Generics umstellen.
Nur ich frag mich schon die ganze Zeit wie nun die Klassendefinition aussehen muss.

Delphi-Quellcode:
TNonFoodList = class(TObjectList<TNonFood>)
TNonFoodList<T: TNonFood> = class(TObjectList<TNonFood>) //Gesehen bei StackOverflow
TNonFoodList<TNonFood> = class(TObjectList<T: class>)
Es müsste doch eigentlich die letzte Variante sein oder?
Da TObjectList<T> so definiert ist:
Delphi-Quellcode:
TObjectList<T: class> = class(TList<T>)
:gruebel: :gruebel:

m.wollert 16. Feb 2010 22:41

Re: Von TObjectList<T> erben?
 
Hi,

für das was Du vermutlich anstellen willst, ist die Variante 1 die Richtige.

Ich gehe davon aus, dass Du eine verwaltete Liste mit Objekten vom Typ TNonFood erstellen möchtest.

Grüße
Michael

ryLIX 16. Feb 2010 22:49

Re: Von TObjectList<T> erben?
 
Ja richtig erkannt es soll vom Typ TNonFood sein.
Is mir irgendwie entfallen das zu erwähnen :roll:

Danke für die Hilfe ich werds nachher mal probieren.

Edit:
Delphi-Quellcode:
TNonFoodList = class(TObjectList<TNonFood>)
Ergibt:
Zitat:

[DCC Fehler] WarenContainerGenerisch.pas(12): E2003 Undeklarierter Bezeichner: 'TObjectList<>'
:?

Khabarakh 16. Feb 2010 23:30

Re: Von TObjectList<T> erben?
 
Generics.Collections hast du aber schon geöffnet?

PS: Bei Listen ist Vererbung unüblich, eine Komposition ist oft einfacher.

ryLIX 16. Feb 2010 23:40

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von Khabarakh
Generics.Collections hast du aber schon geöffnet?

PS: Bei Listen ist Vererbung unüblich, eine Komposition ist oft einfacher.

Grbl das wars -.-
Jetzt compilliert es schon mal :D
Getestet hab ich aber noch nicht.

Was meinst du mit Komposition?
Im Moment bin ich bei der Umstellung auf Generics eh am überlegen ob eventuell ein TDictionary<TValue, TKey> nicht besser ist.
:roll:
Eigentlich herrscht über die Generics bei mir grosse Verwirrung :?

himitsu 17. Feb 2010 06:54

Re: Von TObjectList<T> erben?
 
[quote="ryLIX"]
Zitat:

Zitat von Khabarakh
Generics.Collections hast du aber schon geöffnet?

Das "Blöde" an der Generics-Unit ist, daß da irgendwer auf eine total bescheuerte Idee gekommen ist
und die generischen Klassen genauso benannt hat, wie die Normalen.
Somit kommt es zu solchen blöden Namenspoblemen und irreführenden Fehlermeldungen.

Uwe Raabe 17. Feb 2010 08:04

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von Khabarakh
PS: Bei Listen ist Vererbung unüblich, eine Komposition ist oft einfacher.

In diesem Fall handelt es sich aber nicht um klassische Vererbung, sondern um die Instanziierung(Typisierung?) eines generischen Typs.

Es ist z.B. auch nicht möglich, eine Variable eines generischen Typs zu deklarieren (außer als Feld in einer generische Klasse):

Delphi-Quellcode:
var
  List: TObjectList<T>;
läßt sich nicht compilieren.

Damit scheidet eine Komposition schon mal aus.

Man muss sich Generics einfach als Klassen-Vorlagen vorstellen. Erst durch die Bestimmung des oder der variablen Typen wird daraus eine verwendbare herkömmliche Klasse. Mit

Delphi-Quellcode:
type
  TNonFoodList = class(TObjectList<TNonFoodList>);
wird implizit eine Klassendeklaration erstellt, bei der alle "T" in TObjectList<T> durch TNonFood ersetzt werden.

himitsu 17. Feb 2010 08:22

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von Uwe Raabe
Delphi-Quellcode:
var
  List: TObjectList<T>;
läßt sich nicht compilieren.

Und mit welcher Fehlermeldung?

Sowas läßt sich z.B. bei mir compilieren:
Delphi-Quellcode:
var
  List: TObjectList<TEdit>;
Zitat:

Zitat von Uwe Raabe
Man muss sich Generics einfach als Klassen-Vorlagen vorstellen. Erst durch die Bestimmung des oder der variablen Typen wird daraus eine verwendbare herkömmliche Klasse.

Jupp, es wird praktisch beim Compilieren eine Kopie dieser Vorlage erstellt, die angegebenen Typen darin ersetzt und dann alles als eigenständiger Code kompiliert.
(es sei denn es wurde vorher schonmal eine gleichartige Typ-Kombination für diesem Generic kompiliert, dann wird diese natürlich wiederverwendet)

Dieses würde alle nötigen Codes doppelt in die Anwendung reinkompiliert ... einmal alles mit TEdit und dann nochmal alles mit TButton:
Es wäre praktisch so, als wenn man zwei Objektlisten im QuellCode "parallel" erstellt hätte.
Delphi-Quellcode:
var
  ListA: TObjectList<TEdit>;
  ListB: TObjectList<TButton>;

Uwe Raabe 17. Feb 2010 09:31

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Uwe Raabe
Delphi-Quellcode:
var
  List: TObjectList<T>;
läßt sich nicht compilieren.

Und mit welcher Fehlermeldung?

[DCC Fehler] Unit12.pas(43): E2003 Undeklarierter Bezeichner: 'T'

Zitat:

Zitat von himitsu
Sowas läßt sich z.B. bei mir compilieren:
Delphi-Quellcode:
var
  List: TObjectList<TEdit>;

Bei mir natürlich auch. Mit der Angabe von TEdit wird ja auch das "generische" aus dem Typ aufgelöst. Das unterstreicht meine Aussage, das man keine Variablen vom Typ eines Generics deklarieren kann (bis auf die besagte Ausnahme).

himitsu 17. Feb 2010 09:39

Re: Von TObjectList<T> erben?
 
Achso ja, wenn du eine Variable deklarierst, dann müssen natürlich auch alle Typen aufgelöst werden,
denn "T" kennt der Compiler "zufällig" nicht und an dieser Stelle möchte er ja gern die Klasse erstellen, wofür er nunmal der fertig/vollständig deklarierten Typ benötigt ... z.B. für die spätere Speicherverwaltung und Dergleichen.

Witzig wäre es für dich geworden, wenn rein zufällig irgendein Typ mit dem Namen "T" an dieser Stelle existiert hätte. :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 Uhr.
Seite 1 von 4  1 23     Letzte »    

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