2010-02-09 9 views
5

En Delphi 2010, he definido un TInterfaceList genérica de la siguiente manera:¿Es Delphi generic TInterfaceList posible?

type 

TInterfaceList<I: IInterface> = class(TInterfaceList) 
    function GetI(index: Integer): I; 
    procedure PutI(index: Integer; const Item: I); 
    property Items[index: Integer]: I read GetI write PutI; default; 
end; 

implementation 

function TInterfaceList<I>.GetI(index: Integer): I; 
begin 
    result := I(inherited Get(Index)); 
end; 

procedure TInterfaceList<I>.PutI(index: Integer; const Item: I); 
begin 
    inherited Add(Item); 
end; 

no he tenido ningún problema todavía, pero ¿hay algo inherentemente arriesgada de hacer esto? ¿Sería posible agregar un enumerador para permitir que los bucles..in trabajen en él? Si no tiene nada de malo, me pregunto por qué algo similar no está ya definido en la RTL.

Respuesta

11

No utilice TInterfaceList como una clase base.

Si trabaja con subprocesos simples, puede usar un TList<I: IInterface> en su lugar. El rendimiento sería mejor, ya que no hay bloqueo interno.

Si trabaja en subprocesos múltiples, la interfaz pública de TInterfaceList no es adecuada, como es el concepto de enumeradores, ya que se implementan en el VCL. Para una discusión de una mejor API para iterar de forma segura sobre una colección de cosas, vea this blog post.

Si comparte su lista de interfaces entre subprocesos, debe bloquearla lo más breve posible. Una buena forma de hacerlo es implementar un método seguro para subprocesos que devuelva una matriz de interfaces a la cadena de llamada, que luego se puede iterar de forma segura, sin mantener la lista original bloqueada.