Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   ObjectList vs, Generic List Umwandlung (https://www.delphipraxis.net/173359-objectlist-vs-generic-list-umwandlung.html)

bernhard_LA 19. Feb 2013 20:48

ObjectList vs, Generic List Umwandlung
 
Mit folgendem Demo code möchte ich eine ObjectList in eine Generic Liste konvertieren. Der Compiler sagt Ok, ist diese Verfahren dann auch OK ?

Delphi-Quellcode:


unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Types, Data.Win.ADODB, Generics.Collections, contnrs,
  Vcl.StdCtrls;

type

   TMyTestClass = class
       myName : String;
       myNumber : Integer;
   end;

   TMyObjectList =class( TObjectList)

   end;



  TGenericTestList = TList<TMyTestClass>;




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

var
  Form1: TForm1;

implementation

{$R *.dfm}


function DoSomething_with_TObjectList ( aMyObjectList : TMyObjectList) : boolean;
begin
     //  .....
     result := true;
end;


function DoSomething_with_TGenericList ( aGenericTestList : TGenericTestList) : boolean;
begin
     //  .....
     result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var MyObject: TMyTestClass;
  MyList: TMyObjectList;
  MyGenericTestList : TGenericTestList;
Begin


  MyObject := TMyTestClass.Create;

  MyList := TMyObjectList.Create(True);
  MyList.Add(MyObject);

  MyGenericTestList := TGenericTestList.create;
  MyGenericTestList.Add (MyObject);

  //operating code....

  DoSomething_with_TObjectList( TMyObjectList( MyGenericTestList));

  DoSomething_with_TGenericList( TGenericTestList ( MyGenericTestList));


  MyList.Free;

end;

end
Einschränkungen / Randbedingungen die ich beachten muss? In die objectList füge ich nur Elemente der Class TMyTestClass ein

Uwe Raabe 19. Feb 2013 21:59

AW: ObjectList vs, Generic List Umwandlung
 
Zitat:

Zitat von bernhard_LA (Beitrag 1204391)
Delphi-Quellcode:
  DoSomething_with_TObjectList( TMyObjectList( MyGenericTestList));

  DoSomething_with_TGenericList( TGenericTestList ( MyGenericTestList));

Der Compiler sagt OK, weil du ihm mit dem harten Cast gesagt hast: Hey, ich weiß was ich tue. Das ist OK.

Stevie 20. Feb 2013 07:17

AW: ObjectList vs, Generic List Umwandlung
 
TObjectList und TList<T> sind binär komplett inkompatibel und damit dürfte
Delphi-Quellcode:
DoSomething_with_TObjectList
zur Laufzeit dezent gegen die Wand klatschen.

bernhard_LA 20. Feb 2013 12:02

AW: ObjectList vs, Generic List Umwandlung
 
habe halt viele Funktionen im Projekt die noch mit TObject Liste als Übergabeparameter arbeiten, wollte mir eigentlich das "Listen Kopieren& umwandeln" schenken, was wären denn die eleganteste Lösung für diese Problem

Stevie 20. Feb 2013 12:19

AW: ObjectList vs, Generic List Umwandlung
 
Beste (und *spoiler* zukunftssichere) Lösung ist, sich von Klassen aus Contnrs.pas zu verabschieden.

Die Alternative, die aber mehr schlecht als recht wäre, da in beiden Klassen die entscheidenden Methoden nicht virtual sind, einen Adapter zu bauen.

Eine andere wäre, nicht die generischen Klassen aus Generics.Collections zu nehmen, sondern eine eigene von TObjectList abzuleiten.

stahli 20. Feb 2013 13:53

AW: ObjectList vs, Generic List Umwandlung
 
Eine generische Liste spart ja eigentlich "nur" Schreibarbeit.
Man braucht dann nicht prüfen, welche Objekte in einer Liste stehen und kann auf das Casten der Einträge verzichten.

M.E. bringt es also nichts, bestehenden Projekte und/oder Funktionen komplett umzustellen. Für die Zukunft generische Listen zu verwenden ist dann aber eine gute Entscheidung (es sei denn, man arbeitet viel mit der RTTI und will dynamisch mit den Listen und Klassen arbeiten).


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 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