Является Delphi универсальный возможный TInterfaceList?

В 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.

7
задан Alan Clark 9 February 2010 в 11:45
поделиться

1 ответ

Не используйте TInterfaceList в качестве базового класса.

Если вы выполняете однопоточную работу, вы можете просто использовать вместо него TList . Производительность была бы лучше, так как нет внутренней блокировки.

Если вы выполняете многопоточную работу, открытый интерфейс TInterfaceList не подходит, как и концепция счетчиков, реализованная в VCL. Для обсуждения лучшего API для безопасной итерации по набору вещей см. это сообщение в блоге .

Если вы делитесь своим списком интерфейсов между потоками, вы должны заблокировать его как можно короче. Хороший способ сделать это - реализовать потокобезопасный метод, который возвращает массив интерфейсов вызывающему потоку, который затем можно безопасно повторять, не блокируя исходный список.

13
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: