Delphi - 仿制药免费
Delphi - Generics free
具有以下泛型 class
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/integer等。直接回答你的问题:
PObject(@fItem1).DisposeOf;
但只有T1为class时才能正常工作。
正确的解决方案是定义 TTuple 并限制类型:
TTuple<T1: class; T2> = class
然后就可以正常释放了:
fItem1.Free
要使其成为 Delphi-like 样式,您可以创建两个通用 classes:
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>
具有以下泛型 class
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/integer等。直接回答你的问题:
PObject(@fItem1).DisposeOf;
但只有T1为class时才能正常工作。 正确的解决方案是定义 TTuple 并限制类型:
TTuple<T1: class; T2> = class
然后就可以正常释放了:
fItem1.Free
要使其成为 Delphi-like 样式,您可以创建两个通用 classes:
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>