Las clases en Generics.Collections
no implementan IInterface
. Tendrá que presentarlo usted mismo en sus clases derivadas y proporcionar las implementaciones estándar. O encuentre un conjunto de clases de contenedor diferente, de terceros para trabajar.
Por ejemplo:
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;
Luego, puede declarar su clase especializada:
TMyList = class(TInterfacedList<IMyItem>, IMyList)
Recuerde que usted necesita para tratar esta clase como cualquier otro que utiliza la administración de referencia contado toda la vida. Solo haz referencia a ella a través de interfaces.
Realmente querrías hacer un poco más de trabajo antes de que TInterfacedList<T>
fuera útil. Debería declarar un IList<T>
que expondría las capacidades de la lista. Sería algo así:
IList<T> = interface
function Add(const Value: T): Integer;
procedure Insert(Index: Integer; const Value: T);
.... etc. etc.
end;
continuación, puede simplemente añadir IList<T>
a la lista de interfaces soportadas por TInterfacedList<T>
y la clase base TList<T>
cumpliría el contrato interfaz.
TInterfacedList<T> = class(TList<T>, IInterface, IList<T>)
¿Es seguro para copiar los métodos de la TInterfaceObject? –
De acuerdo. ¡Trataré de recordar eso! –
He desarrollado la respuesta un poco. No es mucho trabajo conseguir un 'IList' bastante capaz basado en 'TList '. –