Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Generics.TObjectList (https://www.delphipraxis.net/171364-generics-tobjectlist.html)

HJay 2. Nov 2012 09:39

Generics.TObjectList
 
Ich habe immer noch nicht verstanden, wie man mit der "neuen" Generics.TObjectList nun eine Liste definiert, die beliebige andere typisierte Listen aufnehmen kann.

Eine "alte" TObjectList konnte doch auch beliebige abgeleitete Klassen aufnehmen.

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Generics.Collections;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


type
  TMyClass1 = class(TObject)
    Dummy : String;
  end;

  TMyClassList1 = class(TObjectList<TMyClass1>);

  TMyClass2 = class(TObject)
    Test : Integer;
  end;

  TMyClassList2 = class(TObjectList<TMyClass2>);

var
  Form1: TForm1;

  AMyClassList1 : TMyClassList1;
  AMyClassList2 : TMyClassList2;

  AObjectList : TObjectList<TObject>; // ???

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  AObjectList := AMyClassList1; // Compiler-Error
  AObjectList := AMyClassList2;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AMyClassList1 := TMyClassList1.Create(True);
  AMyClassList2 := TMyClassList2.Create(True);
end;

end.
Wie muss man AObjectList deklarieren, damit die Variable Listenobjekte beider definierter Klassen MyClassList1,2 annehmen kann?

Ich habe eine (alte) Komponente, die eine Art graphische Tabelle darstellt und beliebige abgeleitete TObjectList annimmt. Ich verstehe nicht, wie man dieses alte Konzept mit der neuen Klasse verwendet.

Jonas Shinaniganz 2. Nov 2012 09:46

AW: Generics.TObjectList
 
Bei den Generics geht es auch um Typensicherheit. Du kannst die Liste immer für einen Typen zur Zeit nutzen... Aber an verschiedenen Stellen verschiedene Listen für verschiedene Typen haben.

So richtig viel mehr, außer die Typensicherheit hast du von der Generischen Version nicht.

Richtig Cool werden Generics nur, wenn du selbst generische Klassen schreibst.

Grüße

stahli 2. Nov 2012 09:48

AW: Generics.TObjectList
 
Generics haben einen anderen Zweck.

Die Items sind in einer normalen TObjectList eben Objekte.
Wenn Du in der Liste Autos verwaltest, musst Du die Objekte casten:

(MyList.Items[0] as TCar)...

Eine generische Liste nimmt Dir das ab. Da sind immer alle Items von dem Typ, den Du beim Erzeugen der Liste angegeben hast.

MyList<TCar>.Items[0] is TCar;
MyList<TBicycle>.Items[0] is TBicycle;

Alle Methoden der Liste bezihen sich dann auf den angegeben Typ, ohne dass Du die Klasse umschreiben und die Items casten musst.

Stevie 2. Nov 2012 11:58

AW: Generics.TObjectList
 
Sowas hatten wir erst neulich hier.

Ein "Problem" mit Generics in Delphi im Gegensatz zu C# ist, dass es keine Kovarianz und "unbound generic types" gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.

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