Классы в Generics.Collections
не реализуют IInterface
. Вы должны будете сами представить его в своих производных классах и предоставить стандартные реализации. Или найдите другой сторонний набор классов контейнеров для работы.
Например:
TInterfacedList<T> = class(TList<T>, IInterface)
protected
FRefCount: Integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
function TInterfacedList<T>.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TInterfacedList<T>._AddRef: Integer;
begin
Result := InterlockedIncrement(FRefCount);
end;
function TInterfacedList<T>._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
Затем вы можете объявить свой специализированный класс:
TMyList = class(TInterfacedList<IMyItem>, IMyList)
Помните, что вы должны относиться к этому классу как к любому другому, в котором используется управление временем жизни с подсчетом ссылок. Обращайтесь к нему только через интерфейсы.
Вы бы действительно хотели проделать дополнительную работу, прежде чем TInterfacedList<T>
был бы полезен. Вам нужно будет объявить IList<T>
, который предоставит возможности списка. Это было бы что-то вроде этого:
IList<T> = interface
function Add(const Value: T): Integer;
procedure Insert(Index: Integer; const Value: T);
.... etc. etc.
end;
Затем вы можете просто добавить IList<T>
в список интерфейсов, поддерживаемых TInterfacedList<T>
, и базовый класс TList<T>
выполнит контракт интерфейса.
TInterfacedList<T> = class(TList<T>, IInterface, IList<T>)