参数化类型的方法在制作通用接口工厂时不能使用局部符号错误
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;
我正在尝试为 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;