作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编写使用通用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;
最佳答案
您的示例解决方案不起作用的原因是实例化泛型类型的子类型关系相对于类型参数的子类型关系的不变性:示例中的类型参数(TTest1
和TObject
)具有继承关系的事实并不意味着实例化的类型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/
我是一名优秀的程序员,十分优秀!