下面的 Delphi 代码在 Foo 函数中没有编译错误,但 Foo2 函数编译。它让我发疯,有人有想法吗?
type
IA<T> = Interface
end;
TA<T> = class(TInterfacedObject, IA<T>)
function Foo<V> : IA<V>;
end;
TB<U,T> = class(TA<T>)
end;
TC = class
function Foo2<T,V> : IA<V>;
end;
implementation
{ TA<T> }
function TA<T>.Foo<V>: IA<V>;
begin
Result := TB<T,V>.Create;
end;
{ TC }
function TC.Foo2<T,V>: IA<V>;
begin
Result := TB<T,V>.Create;
end;
最佳答案
这看起来确实很奇怪,我怀疑这是一个错误。您可以通过声明 TB<U, T>
来解决它。实现 IA<T>
.改变
TB<U, T> = class(TA<T>)
到
TB<U, T> = class(TA<T>, IA<T>)
请注意,删除了所有泛型的代码确实可以编译:
type
IA = interface
end;
TA = class(TInterfacedObject, IA)
function Foo: IA;
end;
TB = class(TA)
end;
TC = class
function Foo2: IA;
end;
function TA.Foo: IA;
begin
Result := TB.Create;
end;
function TC.Foo2: IA;
begin
Result := TB.Create;
end;
这似乎支持了我的信念,即您的代码是正确的并且应该被编译器接受。
关于泛型和接口(interface)的Delphi错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55117207/