ove*_*tor 9 delphi generics forward-declaration type-constraints delphi-xe8
我在Delphi XE8中有一个类的以下声明:
TestClass = class;
TestClass = class
function test<T: TestClass>(supplier: TFunc<T>): T; // Compiler error
end;
Run Code Online (Sandbox Code Playgroud)
这会抛出以下编译器错误:
E2086 Type 'TestClass' is not yet completely defined
Run Code Online (Sandbox Code Playgroud)
当我在混合中添加另一个类并将其作为约束使用时,它可以正常工作:
AnotherTestClass = class
end;
TestClass = class;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T; // No Error
end;
Run Code Online (Sandbox Code Playgroud)
我怀疑问题是前向类型声明没有告诉Delphi足够的TestClass类型.这可能更明显,因为以下尝试解决该问题会在不同的行上抛出相同的编译器错误:
TestClass = class;
AnotherTestClass = class (TestClass) // Compiler Error
end;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T;
end;
Run Code Online (Sandbox Code Playgroud)
我做错了什么,如果没有,是否有解决这个问题的方法?
你没有做错任何事.您正在尝试的应该是可能的,但在我看来,编译器是有缺陷的.如果不完全改变设计,就没有可行的方法来解决这个问题.解决该问题的一种方法是在运行时强制执行约束.然而,在我看来,这将完全改变设计.
请注意,在.net中,您尝试做的事情是完全可能的:
class MyClass
{
private static T test<T>(Func<T> arg) where T : MyClass
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
Delphi泛型功能基于.net泛型,我更倾向于怀疑您遇到的问题是Delphi开发人员的疏忽.
您应该提交错误报告/功能请求.
更新1
LU RD提出了一个更好的解决方法.使用类助手:
type
TestClass = class
end;
TestClassHelper = class helper for TestClass
function test<T: TestClass>(supplier: TFunc<T>): T;
end;
Run Code Online (Sandbox Code Playgroud)
这将允许您在编译时测试约束.但是,它确实强制您在函数外部定义不整齐的方法,并且它会阻止您将类助手用于任何其他目的.因此,您仍应在我的视图中提交错误报告/功能请求.
更新2
错误报告:RSP-13348