|
Delphi Lists via derivation vs via encapsulationFrom: Natalie Vincent Hi all, As requested, here are the two ways discussed last night to implement a TCarList. One way is via derivation, the other via encapsulation. I favour TCarList1 because you don't need to reimplement all the other methods on TObjectList, like Delete, Exchange, etc. The only down fall of it is that if it is passed to something that treats it as a TObjectList, there is the possibility that other TObject descendants could be added to the list. You can get around this (if you're worried) overriding Notify(), checking the type of the added object and throwing an exception if it's incorrect. I'll leave that as an exercise to the reader! :-) unit Unit3; interface uses Contnrs, Classes; type TCar = class public function Beep: string; virtual; end; TPorche = class (TCar) public function Beep: string; override; end; TCarList1 = class (TObjectList) private function GetCar(AIndex: integer): TCar; procedure SetCar(AIndex: integer; const Value: TCar); public function Add(ACar: TCar): integer; property Items[AIndex: integer]: TCar read GetCar write SetCar; default; end; TCarList2 = class private FItems: TList; function GetItems(AIndex: integer): TCar; procedure SetItems(AIndex: integer; const Value: TCar); public constructor Create; destructor Destroy; override; function Add(ACar: TCar): integer; property Items[AIndex: integer]: TCar read GetItems write SetItems; default; end; implementation { TCarList1 } function TCarList1.Add(ACar: TCar): integer; begin result := inherited Add(ACar); end; function TCarList1.GetCar(AIndex: integer): TCar; begin result := Get(AIndex); end; procedure TCarList1.SetCar(AIndex: integer; const Value: TCar); begin Put(AIndex, Value); end; { TCar } function TCar.Beep: string; begin result := 'Beep'; end; { TPorche } function TPorche.Beep: string; begin result := 'Beeeeeeeeeeeppppp'; end; { TCarList2 } function TCarList2.Add(ACar: TCar): integer; begin result := FItems.Add(ACar); end; constructor TCarList2.Create; begin inherited; FItems := TList.Create; end; destructor TCarList2.Destroy; begin FItems.Free; inherited; end; function TCarList2.GetItems(AIndex: integer): TCar; begin result := FItems[AIndex]; end; procedure TCarList2.SetItems(AIndex: integer; const Value: TCar); begin FItems[AIndex] := Value; end; end. ============================ Natalie Vincent Developer Footy Tipping Software ============================ mailto:natalie@footy.com.au http://www.footy.com.au/nat/ ============================ |