2010-02-09 7 views
5

In Delphi 2010 Ich habe eine generische TInterfaceList wie folgt definiert:Ist Delphi generische TInterfaceList möglich?

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; 

ich keine Probleme noch nicht gehabt haben, aber gibt es etwas von Natur aus riskant dies zu tun? Wäre es möglich, einen Enumerator hinzuzufügen, damit for..in-Schleifen daran arbeiten können? Wenn daran nichts falsch ist, frage ich mich, warum etwas Ähnliches nicht schon in der RTL definiert ist.

Antwort

11

Verwenden Sie nicht TInterfaceList als Basisklasse.

Wenn Sie single-threaded arbeiten, könnten Sie stattdessen eine TList<I: IInterface> verwenden. Leistung wäre besser, da es keine interne Verriegelung gibt.

Wenn Sie Multithread-Arbeiten durchführen, ist die öffentliche Schnittstelle TInterfaceList ungeeignet, ebenso wie das Konzept der Enumeratoren, wie sie in der VCL implementiert sind. Für eine Diskussion über eine bessere API, um sicher über eine Sammlung von Dingen zu iterieren, siehe this blog post.

Wenn Sie Ihre Liste von Schnittstellen zwischen Threads teilen, sollten Sie sie so kurz wie möglich sperren. Eine gute Möglichkeit ist das Implementieren einer threadsicheren Methode, die ein Array von Schnittstellen an den aufrufenden Thread zurückgibt, die dann sicher durchlaufen werden können, ohne die ursprüngliche Liste gesperrt zu lassen.

Verwandte Themen