Delphi:泛型和类型约束

Posted

技术标签:

【中文标题】Delphi:泛型和类型约束【英文标题】:Delphi: generic and type constraints 【发布时间】:2009-11-12 14:20:15 【问题描述】:

是否可以将泛型的类型限制为两个不同的类?

像这样:

TSomeClass<T: FirstClass; T: SecondClass> = class
  // ...
end;

(抱歉,缺少格式 - SO 工具栏已从我的浏览器中消失)。 我知道上面不会编译,它只是为了给你们一个想法而写的。我试过了

TSomeClass<T: FirstClass, SecondClass> = class
  // ...
end;

但后来我不被允许写作

procedure TSomeClass.SomeMethod<T> (Param1: string);

这可能吗?

【问题讨论】:

只需使用 4 个空格缩进来获取源代码格式...您不需要工具栏来实现它:) 【参考方案1】:

不,这是不可能的。编译器应该如何能够静态验证您的方法调用是否有效?

注意,那个

TSomeClass <T : FirstClass, SecondClass>

不是有效的类型约束。您不能组合多个类约束。不过,您可以将类约束与一些接口约束结合起来。但即便如此

TSomeClass <T : TSomeClass, ISomeInterface>

意味着泛型类型必须从TSomeClass 继承实现ISomeInterface

所以你唯一能做的就是提取FirstClassSecondClass之间共有的东西,把它放在一个接口中并使用接口约束:

TSomeClass <T : IOnePointFive>

也许你可以提供更多关于你想要达到的目标的细节。

【讨论】:

感谢粉碎机。对我来说,无论如何,泛型似乎很神奇,所以我不知道编译器能不能捕捉到什么……但是让它们实现相同的接口是一个可以接受的解决方案。实际上,我通过使用类方法解决了我的问题:原来我的类之间的不同是类范围的差异。使用类方法,我不需要类的实例来制作它,因此可以解决它。【参考方案2】:

让两个类实现相同的接口是可行的方法。然后将泛型约束到该接口。

【讨论】:

谢谢吉姆。我希望我能接受你和 Smasher 的回答,但我从 Smasher 开始就接受他的回答,而且由于他帖子的详细程度。但是感谢您的努力!

以上是关于Delphi:泛型和类型约束的主要内容,如果未能解决你的问题,请参考以下文章

《C#零基础入门之百识百例》(八十二)泛型类型参数Where约束 -- 泛型单例

《C#零基础入门之百识百例》(八十二) 泛型类型参数Where约束 -- 泛型单例

Delphi 泛型约束问题

C# 泛型方法约束为继承自某类时,调用方法,传子类实参,为什么报错?应该怎么写

C#中的泛型和泛型集合

第11讲-Java泛型和文件操作