2010-02-09 14 views
5

In Delphi 2010, ho definito un TInterfaceList generica come segue:È possibile utilizzare TInterfaceList generico Delphi?

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; 

non ho ancora avuto alcun problema, ma c'è qualcosa di intrinsecamente rischioso a fare questo? Sarebbe possibile aggiungere un enumeratore per consentire a..in loop di lavorarci sopra? Se non c'è niente di sbagliato in questo, mi chiedo perché qualcosa di simile non sia già definito nella RTL.

risposta

11

Non utilizzare TInterfaceList come classe base.

Se si esegue il lavoro a thread singolo, è possibile utilizzare solo uno TList<I: IInterface>. Le prestazioni sarebbero migliori, in quanto non esiste un blocco interno.

Se si esegue il lavoro con più thread, l'interfaccia pubblica di TInterfaceList non è adatta, così come il concetto di enumeratore così come sono implementati nel VCL. Per una discussione su una migliore API per iterare in sicurezza su una collezione di cose, vedi this blog post.

Se si condivide l'elenco di interfacce tra thread, è necessario bloccarlo il più breve possibile. Un buon modo per farlo è implementare un metodo thread-safe che restituisce una serie di interfacce al thread chiamante, che può quindi essere tranquillamente ripetuto, senza mantenere l'elenco originale bloccato.

Problemi correlati