2010-02-09 10 views
5

W Delphi 2010, I mieć zdefiniowane rodzajowe TInterfaceList następująco:Czy jest możliwa ogólna nazwa TInterfaceList 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; 

nie miałem żadnych problemów, ale jest coś z natury ryzykowne ow ten sposób? Czy byłoby możliwe dodanie do niego modułu wyliczającego w celu umożliwienia pracy w pętli? In? Jeśli nie ma w tym nic złego, zastanawiam się, dlaczego coś podobnego nie zostało jeszcze zdefiniowane w RTL.

Odpowiedz

11

Nie używaj TInterfaceList jako klasy bazowej.

Jeśli wykonujesz pracę jednowątkową, możesz zamiast tego użyć TList<I: IInterface>. Wydajność byłaby lepsza, ponieważ nie ma wewnętrznego blokowania.

Jeśli wykonujesz pracę wielowątkową, publiczny interfejs TInterfaceList jest nieodpowiedni, podobnie jak koncepcja modułów wyliczających, ponieważ są one implementowane w VCL. Aby omówić lepszy interfejs API, aby bezpiecznie przeprowadzać iterację w zestawie elementów, zobacz this blog post.

Udostępniając listę interfejsów między wątkami, należy ją zablokować tak krótko, jak to możliwe. Dobrym sposobem na to jest implementacja bezpiecznej dla wątków metody, która zwraca tablicę interfejsów do wątku wywołującego, która może być następnie bezpiecznie iterowana bez utrzymywania pierwotnej listy zablokowanej.

Powiązane problemy