![]() |
TCollection und Vererbung?
Hallo zusammen,
Ich habe ein Verständnis-Problem und bitte um Hilfe. Ich habe, als Beispiel:
Code:
Davon Abgeleitet soll es mehrere Klassen geben, z.B.:
TBasicItem = class(TCollectionItem)
private fE1: integer; fE2: string; public property e1: integer read fE1 write fE1; property e2: string read fE2 write fE2; end;
Code:
Soweit, so einfach. ;-)
TAddressItem = class(TBasicCollectionItem)
private fE3: boolean; public property e3: boolean read fE3 write fE3; end; In einer Grundklasse, abgeleitet von TCollection, will ich die Methoden speichern, die für alle Nachfahren auch gelten können, und hier wird's bunt, der berühmte Wald, ihr wißt schon. ;-)
Code:
Muss ich die Entry-Eigenschaft überhaupt definieren, oder hat TCollection schon sowas, und ich hab's nicht gefunden?
TBasicCollection = class(TCollection)
public entries[i: integer]: TBasicCollectionItem read getEntry write setEntry; default; end; Bislang hab ich die passenden Getter und Setter wie folgt deklariert:
Code:
So kann ich also mit
function TBasicCollection.getEntry (i: integer): TBasicCollectionItem;
begin result := inherited items[i] as TBasicCollectionItem; end; procedure TBasicCollection.setEntry (i: integer; a: TBasicCollectionItem); begin inherited items[i] := a; end; c[i] gleich auf ein bestimmtes Item zugreifen. Was passiert aber nun, wenn ich von TBasicCollection eine weitere Klasse ableite, sagen wir:
Code:
Die hat als Einträge dann lauter TAddressItem. Was passiert jetzt mit meinen Gettern/Settern?
TAddress = class (TBasicCollection)
... end; Und swenn meine TBasicCollection eine Methode bekommt, die auf die Entries zugreifen soll, beispielsweise sie speichern, woher weiss dann Delphi, ob nun TAddressItem oder TBasicItem gemeint ist? Kann mir mal jemand auf die Sprünge helfen, bitte? Herzlich grüßt Marco |
AW: TCollection und Vererbung?
[EDIT] OK, Delphi 5 .... dann sind Generics nichts, obwohl es sie schon seit 12 Jahren gibt, außer vielleicht
![]() Eine TCollection kann eh nur einen Typ (gleichzeitig) aufnehmen. (sie erstellt die Items intern, drum gibt man im Contructor den Typ rein) Du kannst dir eine Collectionklasse bauen und je Instanz einen deiner ItemTypen reingeben. Eine TCollection hat bereits ein Items, aber das ist vom Typ TCollectionItem und man müsste beim Zugriff casten. Oder man überdeckt diess Items-Property mit einem Eigenen vom passenden Typ und macht den Cast intern. (das kannst auch dir als generische Collection ableiten und den Typ für Create aus dem generischen Parameter nehmen, sowie als Typ für dein Items-Property)
Delphi-Quellcode:
Dem FormDesigner ist der Typ egal, da er die Properties via RTTI aus den Items holt, um sie anzuzeigen.
type
TBasicCollection<T: class> = class(TCollection) private function GetItem(idx: Integer): T; procedure SetItem(idx: Integer; Value: T); public constructor Create; function Add: T; property Items[idx: Integer]: T read GetItem write SetItem; default; //function Insert(idx: Integer): T; //function FindItemID(ID: Integer): T; //function GetEnumerator: TCollectionEnumerator<T>; inline; //procedure Sort(const AComparer: IComparer<T>); end; function TBasicCollection<T>.Add: T; begin Result := T(inherited Add); end; constructor TBasicCollection<T>.Create; begin Assert(T.InheritsFrom(TCollectionItem), 'bla bla'); inherited Create(TCollectionItemClass(T)); end; function TBasicCollection<T>.GetItem(Idx: Integer): T; begin Result := T(inherited Items[Idx]) end; procedure TBasicCollection<T>.SetItem(Idx: Integer; Value: T); begin inherited Items[Idx] := TCollectionItem(Value); end; Willst du aber wirklich eine TCollection? Die ist eigentlich nur gut als Property, welches seine Items "automatisch" in der DFM speichert und wieder liest und die auch einen Standard-ListenEdior für den ObjectIonspector bereitstellt. (ohne daß man selber einen Code dafür schreiben muß) Ansonsten wäre wohl eine generische TObjectList<> eventuell handlicher zu nutzen. Die generieschen Listen gibt es auch als Dictionary, Queue oder Stack ... jenachdem wie man zugreifen/suchen/befüllen möchte. Oder als ThreadList, inkl. CriticalSection für einen sicheren Zugriff. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 Uhr. |
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-2025 by Thomas Breitkreuz