Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

Uwe Raabe 17. Feb 2010 11:06

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von himitsu
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:

Sollte das mal vorkommen, werde ich dir eine Karte aus der Klapsmühle schreiben...

Panthrax 17. Feb 2010 13:02

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von himitsu
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.

Das ist ganz und gar nicht blöd. Bei überladenen Routinen und Methoden kommt auch jeder klar, wenn er sich einmal die Signaturen dazu ansieht:
Delphi-Quellcode:
procedure Überladen; overload; // "Überladen()"
procedure Überladen(const Wert: Integer); overload; // "Überladen(Integer)"
Bei Typen funktioniert es gleichermaßen:
Delphi-Quellcode:
TObjectList = class { ... } end; // "TObjectList()"
TObjectList<T> = class { ... } end; // "TObjectList(Typ)"
Gerade das macht es so einfach, und man muss sich nicht so viele Bezeichner merken.

Khabarakh 17. Feb 2010 14:04

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von himitsu
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.

Tja, die alten Namen passen eben einfach perfekt, alternative will ich mir gar nicht vorstellen :zwinker: .
/add: Und Panthrax muss ich auch recht geben, ist imo eher eine Vereinfachung als potentielle Verwirrung.

Zitat:

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

Nö. Sobald ein class vorkommt, ist das ganz normale Vererbung. Innerhalb des class wird in der Tat ein generischer Typ instanziert, aber dafür braucht man keine Vererbung, es genügt ein Alias:
Delphi-Quellcode:
type TNonFoodList = TObjectList<TNonFood>;
Solange wir aber nicht über TList<TDictionary<... reden, ist das aber ebenfalls unüblich, man sollte im Code einfach direkt TObjectList<TNonFood> verwenden.

Zitat:

Zitat von himitsu
Es wäre praktisch so, als wenn man zwei Objektlisten im QuellCode "parallel" erstellt hätte.

Ich gehe stark davon aus, dass es wie beim .NET-Jitter gelöst wurde: Für jeden Value Type jeweils eine Kopie, für alle Reference Types (wahrscheinlich nur alle Klassentypen) eine Kopie zusammen.

Zitat:

Zitat von Uwe Raabe
Das unterstreicht meine Aussage, das man keine Variablen vom Typ eines Generics deklarieren kann (bis auf die besagte Ausnahme).

Anders ausgedrückt: Um einen offenen generischen Typ zu verwenden, muss er geschlossen, also alle formalen Typparameter durch konkrete Typen oder Typparameter der umgegebenden Klasse/Methode ersetzt werden.

implementation 17. Feb 2010 16:45

Re: Von TObjectList<T> erben?
 
Also unter FPC werden Generics so spezialisiert:
Delphi-Quellcode:
type
  TNonFoodList = specialize TList<TNonFood>;
Es wundert mich wirklich, dass das unter Delphi vollkommen anders aussieht.

himitsu 17. Feb 2010 16:54

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von implementation
Es wundert mich wirklich, dass das unter Delphi vollkommen anders aussieht.

Eventuell hatte man es nicht hinbekommen dem Compiler ohne ein Keyword wie "specialize" beizubringen, daß gleich ein generischer Typ kommt?

in C ist es auch nicht nötig:
http://msdn.microsoft.com/en-us/magazine/cc163754.aspx

Khabarakh 17. Feb 2010 17:03

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von implementation
Es wundert mich wirklich, dass das unter Delphi vollkommen anders aussieht.

Weil für quasi jedes neuere Sprachfeature und jede neuere API C#/Java Pate standen und sich für FPC wahrscheinlich überhaupt niemand interessiert hat ;) . Wüsste wirklich nicht, warum man so ein vollkommen überflüssiges Keyword einführen sollte; in C# würde mich das jedenfalls in den Wahnsinn treiben, wenn ich jeden Typ explizit instanzieren müsste.

implementation 17. Feb 2010 17:07

Re: Von TObjectList<T> erben?
 
Hab grad mal auf FreePascal.org nachgeschlagen - die Syntax hat sich mal wieder geändert.
Jetzt geht's angeblich auch so: (noch nicht getestet)
Delphi-Quellcode:
// tom proposal:
type
  TNonFoodList = TObjectList<TNonFood>;

// dannym proposal
type
  TNonFoodList = TObjectList of TNonFood;

// plugwash:
type
  TNonFoodList = TObjectList[TNonFood];
Und so 'nen PublicJoke-Proposal mit generischen Units gibt's auch noch. :shock:
Da steigt doch kein Mensch mehr durch...

[ADD]
Die ham sogar generische Routinen eingeführt - sowas hab ich noch nie gesehen

himitsu 17. Feb 2010 17:25

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von implementation
Da steigt doch kein Mensch mehr durch...

Ja, ist voll toll, wenn es jetzt jeder anders machen kann und keiner mehr den Code des Anderen versteht. :-D

http://wiki.freepascal.org/Generics

Panthrax 17. Feb 2010 17:26

Re: Von TObjectList<T> erben?
 
Zitat:

Zitat von himitsu
Eventuell hatte man es nicht hinbekommen dem Compiler ohne ein Keyword wie "specialize" beizubringen, daß gleich ein generischer Typ kommt?

FPC war einfach schneller bei der Sprachweiterung, und man hatte sich einfach etwas überlegen müssen... Man hatte sich eben für das Schlüsselwort "specialize" entschieden.


Zitat:

Zitat von implementation
Die ham sogar generische Routinen eingeführt - sowas hab ich noch nie gesehen

Hm!?
Delphi-Quellcode:
class procedure Generics.Collections.TArray.Sort<T>(...);

implementation 17. Feb 2010 17:30

Re: Von TObjectList<T> erben?
 
Ne, so:
Delphi-Quellcode:
function generic(T) Max(A, B: T): T;
 begin
   if A < B then
     Result := B
   else
     Result := A;
 end;
Ziemlich am Ende der Wiki-Seite steht aber was davon, es würde bisher nur eine Notlösung für Generics laufen. Also wer weiß, ob das wirklich schon alles klappt...

[ADD]
Grad getestet, läuft noch nicht.
Sind alles nur Zukunftspläne, die da auf der Wikiseite stehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.
Seite 2 von 4     12 34      

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 by Thomas Breitkreuz