2010-02-09 1 views
5

, 나는 일반적인 TInterfaceList을 정의했습니다 :Delphi의 일반적인 TInterfaceList가 가능합니까? 다음과 같이 델파이 2010 년

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; 

내가 아직 문제가 없었어요,하지만 아무것도 본질적으로이 일에 대한 위험이 있습니까? 그것이 for..in 루프가 작동하도록 열거자를 추가 할 수 있습니까? 거기에 아무 문제가 없다면 왜 비슷한 것이 아직 RTL에 정의되어 있지 않은지 궁금합니다.

답변

11

TInterfaceList을 기본 클래스로 사용하지 마십시오.

단일 스레드 작업을 수행하는 경우 대신 TList<I: IInterface>을 사용할 수 있습니다. 내부 잠금이 없으므로 성능이 향상됩니다.

멀티 스레드 작업을 수행하는 경우 TInterfaceList 공용 인터페이스는 VCL에서 구현되는 열거 자 개념과 마찬가지로 적합하지 않습니다. 자세한 내용을 보려면 안전하게 API를 반복적으로 수행하는 방법에 대한 설명은 this blog post을 참조하십시오.

스레드간에 인터페이스 목록을 공유하는 경우 가능한 한 짧게 잠글 수 있습니다. 이를 수행하는 좋은 방법은 호출 스레드에 인터페이스 배열을 반환하는 스레드 안전 메소드를 구현하는 것입니다. 그러면 원래 목록을 잠그지 않고 안전하게 반복적으로 반복 할 수 있습니다.