【问题标题】:How can a generic interface refer to a pointer to its type parameter?泛型接口如何引用指向其类型参数的指针?
【发布时间】:2016-02-25 20:46:36
【问题描述】:

简而言之,我希望能够做这样的事情(其中 T 通常是一条记录)

interface
ITable<T> = interface
  ...
  other methods
  ...
  function Append: ^T;
end;

但是正如我们在a question about declaring pointers based on generic types 中看到的,Delphi 不允许^T 构造。如果允许,我可以这样做:

var 
  myrec: PMyRec;
  myTable: ITable<TMyRec>;
begin
  myTable := TableFactory.Build(TMyRec);
  myRec := myTable.Append;
  myRec.FieldA := 'Test';
  .. Do stuff with myTable containing myRec
end;

我想这样做的原因是,我有很多现有的代码都是这样编写的,而不是建立一个记录然后调用一个像MyTable.Add(MyRec)这样接受构建记录的过程,这是更像德尔福的方式。

链接问题的解决方案是在泛型类中使用内部type 语句,但泛型接口 不允许使用type 语句。

为了解决这个问题,我想我可以使用类似 Spring4D 接口集合的东西,使用通用记录来返回指针:

ListRec<T> = record
type
  P = ^T;
private
  InternalList = IList<T>;
public
... exposed list functions
  function Append: PT;
end;

function ListRec<T>.Append: PT;
var
  index: integer;
  TempT: TMyRec;
begin
  index := InternalList.add(TempT);
  result := @InternalList.Items[index];
end;

毕竟,我的问题是:有没有更简单的方法来实现我的目标,还是我把它过度复杂化了?是否有任何明显的缺点(除了使用指针的标准风险)?理想情况下,如果没有别的,我更喜欢纯接口解决方案以实现可测试性。

【问题讨论】:

  • Delphi 根本不允许 ^Something 作为返回类型,无论是否是泛型。所以为它定义一个类型。

标签: delphi generics interface delphi-xe2


【解决方案1】:

在理想情况下,您可以直接声明泛型指针类型:

type
  P<T> = ^T;

但是语言不允许这样做。您可以声明泛型指针类型,但前提是它们包含在另一种类型中。例如:

type
  PointerTo<T> = record
    type
      P = ^T;
  end;

现在你的界面可以是:

type
  ITable<T> = interface
    function Append: PointerTo<T>.P;
  end;

坦率地说,在我看来,这是相当蹩脚的。

【讨论】:

  • 今天太晚了,但明天我会试一试 - 可能很蹩脚,但它只会在一个地方,所以不必经常看;-)
猜你喜欢
  • 2010-10-22
  • 2022-11-18
  • 2023-01-19
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多