Последующий вопрос до this question: (обратите внимание, что это не дубликат, я прошу об альтернативах здесь).Реализация списка с записями
Есть ли способ, чтобы сделать следующую работу:
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;
Благодарим за помощь!
Rob объяснил в своем последнем вопросе, что 'Initialize' была ошибкой в ответе gabr. Так что нет, вы не должны этого использовать. –
Вот что я написал ... вопрос в том, есть ли другие способы сделать эту работу, или просто невозможно создать типы значений, содержащие объекты. – jpfollenius
Вы собираетесь против правил в Delphi здесь. Вы можете получить определенное расстояние по «дороге» при этом, но вы обнаружите, что для вашего метода типа RECORD существуют большие затраты. –