Delphi - 泛型免费

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi - 泛型免费相关的知识,希望对你有一定的参考价值。

有以下泛型课程

 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的类型没有限制。这就是为什么你不能调用析构函数,因为它可以是任何类型,双/整数等。直接回答你的问题:

  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 - 泛型免费的主要内容,如果未能解决你的问题,请参考以下文章

我如何在不使用Delphi约束的情况下确定泛型类型为nil?

在 Delphi XE2 中使用泛型和前向声明时的编译器错误

Delphi:泛型和类型约束

Delphi 泛型约束问题

delphi 线程教学第六节:TList与泛型

delphi新语法之泛型实现的对象池模板