gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:58:45 27 4
gpt4 key购买 nike

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

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: Method of parameterized type declared in interface section must not use local symbol '.TInterfaceImpl` 1'。 TBuilder 的两种风格都不起作用,都因相同的错误而失败。

现在我不确定 .1 来自哪里。在我的“真实”代码中,. 不存在,但 `1 存在。

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

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

最佳答案

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

最简单的解决方法是移动 TInterfaceImpl<T>成为在接口(interface)部分中声明的类型之一内声明的私有(private)类型。

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;

关于delphi - 参数化类型的方法在制作通用接口(interface)工厂时不能使用局部符号错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34047631/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com