Фундаментальные алгоритмы и структуры данных в Delphi | страница 48
Кроме того, класс будет обеспечивать безопасность к типам (type safety). При создании экземпляра класса, необходимо указывать какой тип (или класс) объектов будет в нем храниться. Во время добавления или вставки нового элемента специальный метод будет проверять соответствие типа нового объекта объявленному типу элементов списка.
Интерфейс класса TtdObjectList напоминает интерфейс класса TList. В нем не реализован метод Pack, поскольку в список будут добавляться только объекты, не равные nil. Подробное описание метода Sort будет приведено в главе 5.
Листинг 2.10. Объявление класса TtdObjectList
TtdObjectList = class private
FClass : TClass;
FDataOwner : boolean;
FList : TList;
FName : TtdNameString;
protected
function olGetCapacity : integer;
function olGetCount : integer;
function olGetItem(aIndex : integer): TObject;
procedure olSetCapacity(aCapacity : integer);
procedure olSetCount(aCount : integer);
procedure olSetItem(aIndex : integer; aItem : TObject);
procedure olError(aErrorCode : integer; const aMethodName : TtdNameString; aIndex : integer);
public
constructor Create(aClass : TClass;
aDataOwner : boolean);
destructor Destroy; override;
function Add(aItem : TObject): integer;
procedure Clear;
procedure Delete(aIndex : integer);
procedure Exchange(aIndex1, aIndex2 : integer);
function First : TObject;
function IndexOf(aItem : TObject): integer;
procedure Insert(aIndex : integer; aItem : TObject);
function Last : TObject;
procedure Move(aCurIndex, aNewIndex : integer);
function Remove(aItem : TObject): integer;
procedure Sort(aCompare : TtdCompareFunc);
property Capacity : integer read olGetCapacity write olSetCapacity;
property Count : integer read olGetCount write olSetCount;
property DataOwner : boolean read FDataOwner;
property Items[Index : integer] : TObject read olGetItem write olSetItem; default;
property List : TList read FList;
property Name : TtdNameString read FName write FName;
end;
Целый ряд методов класса TtdObjectLiet является простыми интерфейсами для вызова соответствующих методов внутреннего класса FList. Например, вот реализация метода TtdObjectList.First:
Листинг 2.11. Метод TtdObjectList.First
function TtdObjectList.First : TObject;
begin
Result := TObject(FList.First);
end;
В тех методах, которые в качестве входного параметра принимают индекс, до вызова соответствующего метода класса FList индекс проверяется на предмет попадания в допустимый диапазон. Строго говоря, эта процедура не обязательна, поскольку сам класс FList будет производить аналогичную проверку, но в случае возникновения ошибки методы класса TtdObjectList позволят получить больший объем информации. Вот один из примеров - метод Move: