当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在类声明中使用自己的类作为类型参数约束》经验,为你挑选了1个好方法。

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

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

这会抛出以下编译器错误:

E2086 Type 'TestClass' is not yet completely defined

当我在混合中添加另一个类并将其作为约束使用时,它可以正常工作:

AnotherTestClass = class
end;

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

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

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

我做错了什么,如果没有,是否有解决这个问题的方法?



1> David Heffer..:

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

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

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

Delphi泛型功能基于.net泛型,我更倾向于怀疑您遇到的问题是Delphi开发人员的疏忽.

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

更新1

LU RD提出了一个更好的解决方法.使用类助手:

type
  TestClass = class
  end;

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

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

更新2

错误报告:RSP-13348


将函数移动到类助手编译:`TestClassHelper = TestClass函数测试的类助手(供应商:TFunc ):T; 结束; `.
@LURD好的捕获,这实际上是一个可行的解决方法.该类的行为和API应该与预期的相同,对吧?尽管如此,它仍然是编译器的主要疏忽,所以我仍然会提交错误报告.
在我看来,更好的解决方法是为您的约束使用抽象基类.这样可以更容易地模拟TestClass.添加任何虚拟抽象)函数构成类型签名.
请在此处发布您的错误报告链接.如果他们希望泛型特征更正交和完整,人们可以投票支持它.
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有