delphi - 在类声明中使用自己的类作为类型参数约束

标签 delphi generics forward-declaration delphi-xe8 type-constraints

我在 Delphi XE8 中有以下类声明:

TestClass = class;
TestClass = class
  function test<T: TestClass>(supplier: TFunc<T>): T; // Compiler error
end;

这会引发以下编译器错误:

E2086 Type 'TestClass' is not yet completely defined

当我将另一个类添加到混合中并使用该类作为约束时,它工作得很好:

AnotherTestClass = class
end;

TestClass = class;
TestClass = class
  function test<T: AnotherTestClass>(supplier: TFunc<T>): T; // No Error
end;

我怀疑问题是前向类型声明还没有告诉 Delphi 关于 TestClass 类型的足够信息。这可能更明显,因为以下解决该问题的尝试在不同的行上抛出了完全相同的编译器错误:

TestClass = class;
AnotherTestClass = class (TestClass) // Compiler Error
end;
TestClass = class
  function test<T: AnotherTestClass>(supplier: TFunc<T>): T;
end;

我做错了什么吗?如果没有,有办法解决这个问题吗?

最佳答案

你没有做错任何事。您所尝试的应该是可能的,但在我看来,编译器有缺陷。在不完全改变设计的情况下,没有可行的方法来解决这个问题。解决该问题的一种方法是在运行时强制执行约束。然而,在我看来,这完全改变了设计。

请注意,在 .net 中,您尝试做的事情是完全可能的:

class MyClass
{
    private static T test<T>(Func<T> arg) where T : MyClass
    {
        return null;
    }
}

Delphi 泛型功能基于 .net 泛型,我相当怀疑您面临的问题是由 Delphi 开发人员的疏忽造成的。

您应该提交错误报告/功能请求。

更新1

LU RD 建议更好的解决方法。使用类助手:

type
  TestClass = class
  end;

  TestClassHelper = class helper for TestClass
    function test<T: TestClass>(supplier: TFunc<T>): T;
  end;

这将允许您在编译时测试约束。但是,它确实迫使您在函数外部定义不整洁的方法,并且它会阻止您将类助手用于任何其他目的。因此,在我看来,您仍然应该提交错误报告/功能请求。

更新2

错误报告:RSP-13348

关于delphi - 在类声明中使用自己的类作为类型参数约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34610900/

相关文章:

c# - Mstsc ActiveX 控件警告

delphi - 如何获取(方法: TRttiMethod) in TVirtualInterface TVirtualInterfaceInvokeEvent?

objective-c - 有没有办法向协议(protocol)添加泛型类型参数?

c++ - 为什么 VS2017 会警告 "Function definition not found"对于使用输入 typedef 声明但使用原始定义的函数向前?

C++ 循环引用,使用方法时出错,即使在前向声明之后

delphi - 与 C++Builder 2010 相比,是什么导致 C++ Builder XE4 中的 EXE 大小增加了三倍?

Java 获取封闭泛型类型的类常量(Class<T1<T2>> 的实例)

Java GUI通过组合框改变颜色,使用集合和对象数组

C++前向声明错误

delphi - 将 Delphi 转换为 Borland C++ 构建器