2010-02-09 21 views
5

Trong Delphi năm 2010, tôi đã xác định một TInterfaceList chung như sau:Có phải Delphi generic TInterfaceList có thể không?

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; 

tôi đã không có vấn đề gì, nhưng là có bất cứ điều gì vốn đã nguy hiểm về việc này? Nó sẽ có thể thêm một điều tra viên để nó cho phép ... vòng lặp để làm việc trên nó? Nếu không có gì sai với nó, tôi tự hỏi tại sao một cái gì đó tương tự chưa được xác định trong RTL.

Trả lời

11

Không sử dụng TInterfaceList làm lớp cơ sở.

Nếu bạn thực hiện công việc đơn luồng, bạn chỉ có thể sử dụng TList<I: IInterface> thay thế. Hiệu suất sẽ tốt hơn, vì không có khóa bên trong.

Nếu bạn làm việc đa luồng, giao diện công cộng của TInterfaceList không phù hợp, như là khái niệm về điều tra viên khi chúng được thực hiện trong VCL. Để thảo luận về một API tốt hơn để lặp lại an toàn qua một tập hợp các thứ, hãy xem this blog post.

Nếu bạn chia sẻ danh sách giao diện giữa các chủ đề, bạn nên khóa nó càng ngắn càng tốt. Cách tốt nhất để thực hiện điều đó là thực hiện một phương thức an toàn thread trả về một mảng các giao diện cho chuỗi gọi, sau đó có thể được lặp lại một cách an toàn, mà không giữ danh sách gốc bị khóa.

Các vấn đề liên quan