Hein Blöd - Fr 13.02.04 19:52
Titel: Ist die Klasse richtig?
Ich bin noch ein Anfänger und noch weniger weiss ich über Klassen. Was ich brauche ist ein Record mit drei Stringlist. Da aus jedem Stringlist ein Objekt erstellt werden muss bedutet das, dass ich jedes mal drei mal Crate machen muß und drei mal Free. Das ganze dann zig mal im Programm. Da ich dazu aber zu faul bin so dachte ich mir, daß ich einfach eine Klasse erstellen könnte. Die hat einen Constructor und einen Destructor. Wenn ich als den Create Teil in den Constructor lege und den Free Teil in den Destructor, dann spare ich mir jede menge Arbeit. Da ich aber keine Ahnung von Klassen habe wollte ich fragen ob ich es richtig gemacht habe. Kann man das so machen oder fehlt noch was.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| type TListen = class(TObject) Liste1: TStringList; Liste2: TStringList; Liste3: TStringList; public constructor Create; destructor Free; end;
constructor TListen.Create; begin Liste1 := TStringList.Create; Liste2 := TStringList.Create; Liste3 := TStringList.Create; end;
destructor TListen.Free; begin Liste1.Free; Liste2.Free; Liste3.Free; end; |
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt
KidPaddle - Fr 13.02.04 20:14
Ich würde die Klasse wie folgt aufbauen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| type TListen = class(TObject) protected fListe1: TStringList; fListe2: TStringList; fListe3: TStringList; public constructor Create; destructor destructor; override; property Liste1: TStringList read fListe1; property Liste2: TStringList read fListe2; property Liste3: TStringList read fListe3; end;
constructor TListen.Create; begin inherited Create;
fListe1 := TStringList.Create; fListe2 := TStringList.Create; fListe3 := TStringList.Create; end;
destructor TListen.Destroy; begin FreeAndNil(fListe1); FreeAndNil(fListe2); FreeAndNil(fListe3);
inherited Destroy; end; |
Ein paar Bermerkungen:
Destructor Free sollte nicht überschrieben werden, da Free intern Destroy aufruft. Das override hinter dem Destroy; ist notwendig, da sonst dein Destructor niemals aufgerufen wird, wenn das Objekt freigegeben wird.
Objekte sollten, wenn vorhanden, mit FreeAndNil(Objekt) freigegeben werden. Mit dieser Funktion wird das Objekt aus dem Speicher entfernt und gleichzeit die übergebene Variable auf NIL gesetzt. Dadurch kann schnell festgestellt werden, ob das Objekt noch gültig ist.
Die Variablen wurden in den Protected - Abschnitt verschoben, um einen direkt Zugriff zu verhinden. Über die Properties kann ich einen Schreibzugriff verhindern und damit ein potentielle Gefahrenquelle vermeinden.
Wenn Methoden überschrieben werden, hier Create und Destroy, wird in den meisten Fällen die Vorgängermethode mit inherited aufgerufen, da diese Daten für das Objekt reservieren oder freigeben. Machst Du das nicht, können fehlerhaft initializierte Objekt enstehen.
So, das wars von meiner Seite.
Gruß
KidPaddle