gpt4 book ai didi

Delphi - 免费泛型

转载 作者:行者123 更新时间:2023-12-03 14:52:37 29 4
gpt4 key购买 nike

具有以下泛型类

 TTuple<T1, T2> = class
protected
fItem1: T1;
fItem2: T2;
public
constructor Create; overload;
constructor Create(Item1: T1; Item2: T2); overload;
destructor Destroy; override;

property Item1: T1 read fItem1 write fItem1;
property Item2: T2 read fItem2 write fItem2;
end;

constructor TTuple<T1, T2>.Create;
begin
inherited;
end;

constructor TTuple<T1, T2>.Create(Item1: T1; Item2: T2);
begin
fItem1 := Item1;
fItem2 := Item2;
end;

destructor TTuple<T1, T2>.Destroy;
begin
inherited;
end;

并以如下方式使用:

x := TTuple<TObjectList<TMyObjects>, Integer>.Create;

我需要手动释放 fitem1。如何释放析构函数内的 fItem1?

最佳答案

在TTuple的定义中,对T1、T2的类型没有限制。这就是为什么你不能调用析构函数,因为它可以是任何类型, double /整数等。直接回答你的问题:

  PObject(@fItem1).DisposeOf;

但只有T1上课时才能正常工作。正确的解决方案是定义 TTuple 并限制类型:

TTuple<T1: class; T2> = class

然后就可以正常释放它了:

fItem1.Free

要使其成为类似 Delphi 的风格,您可以创建两个泛型类:

TTuple<T1,T2> = class
...
end;

TObjectTuple<T1: class; T2> = class<TTuple<T1,T2>>
...
property OwnsKey: boolean;
end;

destructor TObjectTuple<T1,T2>.destroy;
begin
if OwnsKey then
FItem1.DisposeOf;
end;

例如看看它是如何实现的

TObjectList<T: class>

关于Delphi - 免费泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49083272/

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