2009-11-12 135 views
1

是否有可能将泛型的类型约束为比如说两个不同的类?Delphi:泛型和类型约束

像这样:

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

(很抱歉的缺乏格式 - 的SO工具栏已经从我的浏览器中消失)。 我知道上面不会编译,它的唯一写法是给你们一个想法。我试图

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

但当时我是不允许写

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

这甚至可能吗?

+0

只需使用4个空格缩进来获取源代码格式...你不需要一个工具栏:) – jpfollenius 2009-11-12 15:22:29

回答

10

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

注意,那

TSomeClass <T : FirstClass, SecondClass> 

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

TSomeClass <T : TSomeClass, ISomeInterface> 

意味着,通用型有下降,从TSomeClass实施ISomeInterface

所以你能做的唯一一件事就是提取的东西,是FirstClassSecondClass之间共同的,把它放在一个界面,可以用一个接口约束:

TSomeClass <T : IOnePointFive> 

也许你可以给有关的更多细节你想达到什么。

+1

+1为界面的名称:) – Tihauan 2009-11-12 15:23:15

+0

谢谢粉碎机。对我来说,泛型看起来像魔术一样,所以我没有直觉了解编译器能够捕捉或不能捕捉到的东西......但让他们实现相同的接口是一个可接受的解决方案。实际上,我使用类方法解决了我的问题:事实证明,我的类之间的不同之处在于类间差异。使用类方法我不需要类的实例来创建它,并因此解决了它。 – conciliator 2009-11-13 07:16:46

2

让这两个类实现相同的接口是最好的选择。然后限制通用接口。

+0

谢谢吉姆。我希望我能够接受你和Smasher的回答,但是自从他成为第一名后,我就必须和Smasher一起,并且由于他的职位细节程度。但是,谢谢你的努力! – conciliator 2009-11-13 07:12:13