gpt4 book ai didi

delphi - 如何为TList 编写通用FreeAll

转载 作者:行者123 更新时间:2023-12-03 18:30:30 24 4
gpt4 key购买 nike

编写使用通用TList<T>并释放列表中每个元素的FreeAll函数的最佳方法是什么?

TList<T>.FreeAll不存在是有道理的,因为如果通用类型是Record或String则没有意义。但是,如果通用类型是对象,那么如果有某种方法可以实现FreeAll功能,将非常方便。

我简单的尝试无法编译...

TTest1 = Class

End;

Procedure FreeAll(List : TList<TObject>);
Var
I : Integer;
Begin
For I := 0 To List.Count - 1 Do
List[I].Free;
End;


Procedure Main;
Var
List : TList<TTest1>;
I : Integer;
Begin
List := TList<TTest1>.Create;
List.Add(TTest1.Create);
List.Add(TTest1.Create);
List.Free;

FreeAll(List);

List.Free;
End;

最佳答案

您的示例解决方案不起作用的原因是实例化泛型类型的子类型关系相对于类型参数的子类型关系的不变性:示例中的类型参数(TTest1TObject)具有继承关系的事实并不意味着实例化的类型TList<TTest1>TList<TObject>具有继承关系。很容易理解为什么会这样。考虑可分配给类型TList<TCat>的位置b的类型TList<TAnimal>的值;从逻辑上讲,可以将类型为TDog的值插入到b所引用的列表中,即使其运行时类型为TList<TCat>,也不应该让TDog进入。

但是,您可以编写以下方法:

type
TObj = class
procedure FreeAll<T: class>(AList: TList<T>);
end;

procedure TObj.FreeAll<T>(AList: TList<T>);
var
x: T;
begin
for x in AList do
x.Free;
end;

关于delphi - 如何为TList <T>编写通用FreeAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com