Es gibt zwei Arten von Wiederverwendung in der
OOP: Vererbung und Komposition.
Bei der Vererbung hat der neue Typ alle "Features" (Eifel-speak
) des Vorgängers.
Bei der Komposition hält man eine Instanz eines anderen Types als Feld und
verwendet diese Instanz.
Somit hat man eine bessere Kontrolle über das, was von außen verwendet werden kann.
Eine streng typisierte Liste durch Erben von TList ist ein Ding der Unmöglichkeit.
Du hast immer noch die Methode Add, welche einen Pointer nimmt und man kann immer noch einen Pointer auf TIrgendwas reinwerfen.
In deinem Beispiel wäre es also besser ein Feld vom Typen TObjectList herzunehmen, welches deine Daten hält. Aber nach außen bit du wirklich streng auf deine Elementenklasse typisiert.
Außerdem klingt eine Klasse namens "Address
Book" wie etwas, was mehr als nur ein paar Adressen enthält. Eher wie eine weitere Fachklasse, in der ein öhm Adressbuch modelliert ist.
Bleistift:
Delphi-Quellcode:
TContactList = class
private
fInnerList : TObjectList;
function GetItem(aIndex: Integer): TContact;
procedure SetItem(aIndex: Integer; aItem: TContact);
protected
property InnerList : TObjectList read fInnerList;
public
destructor Destroy; override;
procedure Add(aItem : TContact);
procedure Delete(aIndex: Integer);
property Items[aIndex: Integer]: TContact read GetItem write SetItem;
end;
TAddressBook = class
...
public
property Contacts : TContactList read fContacts;
...