Дополнительный вопрос к этому вопросу : (обратите внимание, что это не дубликат, я прошу альтернативы здесь).
Есть ли способ заставить следующую работу:
type
List <T> = record
private
FList : TList <T>;
FGuard : IInterface,
procedure CheckCreated;
public
procedure Add(const Value : T);
end;
procedure List <T>.CheckCreated;
begin
if (FGuard = nil) then
begin
FList := TList <T>.Create;
FGuard := TGuard.Create (FList); // guard calls free on list in destructor
end;
end;
procedure List <T>.Add (const Value : T);
begin
CheckCreated;
FList.Add (Value);
end;
В идеале я хочу использовать это так:
function ReturnHandles : List <THandle>;
begin
Result.Add (2);
Result.Add (3);
end;
Как объяснено в ответах на связанный вопрос, это не работает (что на самом деле жалко). Он не будет создавать новый список при каждом вызове.
К сожалению, это тоже не работает:
function ReturnHandles : List <THandle>;
begin
Initialize (Result);
Result.Add (2);
Result.Add (3);
end;
Утечка из интерфейсов защиты и всех списков, потому что Initialize
просто перезаписывает ссылку на интерфейс, не уменьшая счетчик ссылок.
Есть ли способ заставить эту работу? Или вы бы предложили сделать этот интерфейс вместо записи и просто жить со строительными линиями?
function ReturnHandles : List <THandle>;
begin
Result := List <T>.Create;
Result.Add (2);
Result.Add (3);
end;
Спасибо за вашу помощь!