Các lớp học trong Generics.Collections
không triển khai IInterface
. Bạn sẽ phải tự giới thiệu nó trong các lớp dẫn xuất của bạn và cung cấp các triển khai chuẩn. Hoặc tìm một nhóm thứ ba khác nhau, tập hợp các lớp chứa để hoạt động.
Ví dụ:
TInterfacedList<T> = class(TList<T>, IInterface)
protected
FRefCount: Integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
function TInterfacedList<T>.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TInterfacedList<T>._AddRef: Integer;
begin
Result := InterlockedIncrement(FRefCount);
end;
function TInterfacedList<T>._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
Sau đó bạn có thể khai báo lớp chuyên ngành của bạn:
TMyList = class(TInterfacedList<IMyItem>, IMyList)
Hãy nhớ rằng bạn cần phải đối xử với lớp này giống như bất kỳ khác có sử dụng tài liệu tham khảo tính quản lý suốt đời. Chỉ đề cập đến nó thông qua giao diện.
Bạn thực sự muốn thực hiện một số công việc khác trước khi TInterfacedList<T>
hữu ích. Bạn cần khai báo một số IList<T>
để hiển thị các khả năng của danh sách. Nó sẽ là một cái gì đó như thế này:
IList<T> = interface
function Add(const Value: T): Integer;
procedure Insert(Index: Integer; const Value: T);
.... etc. etc.
end;
Bạn có thể sau đó chỉ cần thêm IList<T>
vào danh sách các giao diện được hỗ trợ bởi TInterfacedList<T>
và lớp cơ sở TList<T>
sẽ thực hiện các hợp đồng giao diện.
TInterfacedList<T> = class(TList<T>, IInterface, IList<T>)
Nguồn
2012-03-26 18:13:20
Có an toàn để sao chép các phương pháp của TInterfaceObject không? –
Được rồi. Tôi sẽ cố nhớ điều đó! –
Tôi đã trả lời một chút. Không có nhiều công việc để có được một 'IList' có khả năng dựa trên 'TList '. –