参数化类型的方法在制作通用接口工厂时不能使用局部符号错误

Method of parameterised Type must not use local symbol error when making generic interface factory

我正在尝试为 return 通用接口 class 编写基本工厂方法。

interface
type
  IGenInterface<T> = interface
    function TestGet:T;
  end;

  TBuilder<T> = class
    class function Build: IGenInterface<T>;
  end;

  TBuilder = class
    class function Build<T>: IGenInterface<T>;
  end;
implementation
type
  TInterfaceImpl<T> = class(TInterfacedObject, IGenInterface<T>)
    function TestGet:T;
  end;

{ TBuilder }

class function TBuilder.Build<T>: IGenInterface<T>;
begin
  result := TInterfaceImpl<T>.create;
end;

{ TInterfaceImpl<T> }

function TInterfaceImpl<T>.TestGet: T;
begin

end;

它看起来很简单,而且我确定我以前写过类似的代码,但是当我尝试编译时,我得到了 E2506:接口部分中声明的参数化类型的方法不能使用局部符号 '。 TInterfaceImpl`1'。 TBuilder 的两种风格都不起作用,都因相同的错误而失败。

现在我不确定 .1 来自哪里。在我的 'real' 代码中, . 不存在,但 ` 1 存在。

我已经查看了引用此错误的其他两个 SO 问题,但我没有使用任何常量或分配变量(函数 return 除外),也没有任何 class变量

有没有人有办法做到这一点而不必将大量代码移到我的界面中?

该问题与泛型的实现细节有关。当您在不同的单元中实例化泛型类型时,它需要在另一个单元中看到 TInterfaceImpl<T> 类型。但是编译器看不到它,因为它在不同单元的实现部分。因此,正如您所观察到的,编译器对象。

最简单的修复方法是将 TInterfaceImpl<T> 移动为在接口部分声明的类型之一内声明的私有类型。

type
  TBuilder = class
  private
    type
      TInterfaceImpl<T> = class(TInterfacedObject, IGenInterface<T>)
      public
        function TestGet: T;
      end;
  public
    class function Build<T>: IGenInterface<T>;
  end;

或者里面的其他class:

type
  TBuilder<T> = class
  private
    type
      TInterfaceImpl = class(TInterfacedObject, IGenInterface<T>)
      public
        function TestGet: T;
      end;
  public
    class function Build: IGenInterface<T>;
  end;