8 Stimmen

Ist in Delphi eine generische TInterfaceList möglich?

In Delphi 2010 habe ich eine generische TInterfaceList wie folgt definiert:

type

TInterfaceList = 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.GetI(index: Integer): I;
begin
  result := I(inherited Get(Index));
end;

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

__

Bisher hatte ich keine Probleme damit, aber gibt es etwas grundsätzlich Risikoreiches daran? Wäre es möglich, einen Enumerator hinzuzufügen, um ..in-Schleifen darauf zu ermöglichen? Wenn nichts dagegen spricht, frage ich mich, warum etwas Ähnliches noch nicht in der RTL definiert wurde.

__

14voto

mghie Punkte 31618

Verwenden Sie TInterfaceList nicht als Basisklasse.

Wenn Sie nur single-threaded arbeiten, könnten Sie stattdessen einfach eine TList verwenden. Die Leistung wäre besser, da keine interne Sperrung erforderlich ist.

Wenn Sie Multi-Threaded-Arbeit durchführen, ist die öffentliche Schnittstelle von TInterfaceList ungeeignet, ebenso wie das Konzept von Enumeratoren, wie sie im VCL implementiert sind. Für eine Diskussion über eine bessere API zum sicheren Iterieren über eine Sammlung von Elementen siehe diesen Blog-Beitrag.

Wenn Sie Ihre Liste von Schnittstellen zwischen Threads teilen, sollten Sie sie so kurz wie möglich sperren. Eine gute Möglichkeit hierfür ist die Implementierung einer thread-sicheren Methode, die einem Array von Schnittstellen an den Aufrufthread zurückgibt, über das dann sicher iteriert werden kann, ohne die originale Liste gesperrt zu halten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X