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

时间:2015-12-02 16:18:29

标签: delphi generics interface delphi-xe2

我正在尝试编写一个基本的工厂方法来返回一个通用的接口类。

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:接口部分声明的参数化类型的方法不能使用本地符号&#39; .innterfaceImpl` 1&#39;。 TBuilder的味道都不起作用,都没有出现同样的错误。

现在我不确定.1的来源。在我的真实&#39;代码,.不在那里,但是`1是。

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

有没有人有办法在不必将大量代码移动到我的界面中的情况下执行此操作?

1 个答案:

答案 0 :(得分:6)

该问题涉及泛型的实现细节。当您在另一个单元中实例化泛型类型时,它需要在该另一个单元中看到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;

或者在另一个班级内:

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