В Delphi 2010 я определил универсальный TInterfaceList следующим образом:
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;
У меня еще не было проблем, но есть ли что-либо по сути опасное о выполнении этого? Было бы возможно добавить перечислитель к нему для обеспечения.. в циклах для работы над ним? Если нет ничего неправильно с ним, интересно, почему что-то подобное уже не определяется в RTL.
Не используйте TInterfaceList
в качестве базового класса.
Если вы выполняете однопоточную работу, вы можете просто использовать вместо него TList
. Производительность была бы лучше, так как нет внутренней блокировки.
Если вы выполняете многопоточную работу, открытый интерфейс TInterfaceList
не подходит, как и концепция счетчиков, реализованная в VCL. Для обсуждения лучшего API для безопасной итерации по набору вещей см. это сообщение в блоге .
Если вы делитесь своим списком интерфейсов между потоками, вы должны заблокировать его как можно короче. Хороший способ сделать это - реализовать потокобезопасный метод, который возвращает массив интерфейсов вызывающему потоку, который затем можно безопасно повторять, не блокируя исходный список.