Sammlung von Objekten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Sammlung von Objekten

Beitrag von Eclipticon »

Hi,

ich erzeuge eine Anzahl aehnlicher Objekte (Zahl von vornherein unbekannt), die alle von einer gemeinsamen abstrakten Klasse abgeleitet sind:

Code: Alles auswählen

type 
   TAbstractElement = class(TObject)
      procedure DoSomething; virtual; abstract;
   end;
 
   TAlphaElement = class(TAbstractElement)
      procedure DoSomething; override;
      ...
   end;
 
   TBetaElement = class(TAbstractElement)
      procedure DoSomething; override;
      ...
   end;
 
var
   Elements: array of TAbstractElement;
 
// ...
 
    SetLength(Elements, 1);
    Elements[0] := TAlphaElement.Create;
    TAlphaElement(Elements[0]).x := ...;
    TAlphaElement(Elements[0]).y := ...;
 
    SetLength(Elements, 2);
    Elements[1] := TAlphaElement.Create;
    TAlphaElement(Elements[1]).x := ...;
    TAlphaElement(Elements[1]).y := ...;
 
    SetLength(Elements, 3);
    Elements[2] := TBetaElement.Create;
    TBetaElement(Elements[2]).a := ...;
    TBetaElement(Elements[2]).b := ...;
 
   // ...
 
   for i := Low(Elements) to High(Elements) do
      Elements.DoSomething;
Gibt's hier von Euerer Seite Optimierungsvorschlaege, wie ich die Objekte erzeuge und verwalte?

Dankeschoen!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sammlung von Objekten

Beitrag von Socke »

Eclipticon hat geschrieben:Gibt's hier von Euerer Seite Optimierungsvorschlaege, wie ich die Objekte erzeuge und verwalte?
Was willst du damit erreichen?
Für einfache Fälle ist dein Ansatz vollkommen richtig und in Ordnung.

Ob du jetzt einen Array oder eine Liste (und wenn ja, welche) nimmst, ist - ohne die Anforderung zu kennen - Geschmackssache.

Bei der Erstlellung kann (insbesondere, wenn du viele Objekte erzeugst), die Fabrikmethode dein Leben erleichtern.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Sammlung von Objekten

Beitrag von theo »

Oder sowas:

Code: Alles auswählen

Unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, fgl;
 
Type
 
   { TAbstractElement }
  TAbstractElement = class(TObject)
      procedure DoSomething; virtual; abstract;
   end;
 
   { TAlphaElement }
   TAlphaElement = class(TAbstractElement)
      procedure DoSomething; override;
   end;
 
   { TBetaElement }
   TBetaElement = class(TAbstractElement)
      procedure DoSomething; override;
   end;
 
   {TAbstractElementList }
  TAbstractElementList = specialize TFPGObjectList<TAbstractElement>;
 
  { TForm1 }
   TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TAlphaElement }
 
procedure TAlphaElement.DoSomething;
begin
  //
end;
 
{ TBetaElement }
 
procedure TBetaElement.DoSomething;
begin
  //
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var List:TAbstractElementList;
 El:TAbstractElement;
begin
 List:=TAbstractElementList.Create;
 List.Add(TAlphaElement.Create);
 List.Add(TBetaElement.Create);
 List[0].DoSomething;
 for El in List do El.DoSomething;
 List.Free;
end;
 
end. 

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Sammlung von Objekten

Beitrag von Eclipticon »

Danke fuer Eurer Feedback, besonders die Liste vereinfacht das ganze in meiner Situation deutlich!

Antworten