2009-09-09 34 views
3

有没有一种方法可以在Delphi 2010中实现静态多态性?Delphi中的静态多态性

+0

如果你的意思是像C++模板 - 它如何适应单位概念?允许在界面部分的代码? – mghie 2009-09-09 13:13:34

+0

Can not udnerstand单元概念如何干扰C++模板的某些功能。其实我想拥有所有可能的C++模板特征(我意识到泛型和模板是不同的),但如果Delphi编译器在通用瞬时化之后使用泛型参数验证了表达式,那么现在就足够了。例如,当T - 是泛型参数时,我不想看到“编译器错误”,并且在我使用此泛型与具体类型之前,试图调用T.do_some()。 – valentyn 2009-09-09 13:55:00

+0

当然,在T不受约束的情况下,你需要一个编译器错误。编译器应该如何知道do_some方法存在?这是什么约束... – jpfollenius 2009-09-10 06:19:07

回答

6

静态多态性是不可能在Delphi;泛型不是模板。与模板不同,泛型在声明时被解析,而不是在实例化时刻。这就是为什么一个编译模块(* .dcu)只需要包含泛型实体的AST表示,而从一个未被证实的C++模板声明构建AST几乎是不可能的。

3

从Delphi 2009开始就有泛型。结合类或接口约束,您可以使用它们实现静态多态。

不幸的是,2009年德尔福泛型支持是非常错误,所以你可能要考虑用Delphi 2010(重读你的问题,你似乎可以用D2010反正)

+0

但泛型中的类或接口约束意味着将使用vmt(运行时开销),这仍然是动态多态。不是吗? – valentyn 2009-09-09 12:56:21

+0

运行时间开销应该是最小的(我猜想是1个数组查询),那为什么它终究会有所作为? – jpfollenius 2009-09-09 13:28:09

+1

数组查找和过程调用我猜。相同的虚拟函数调用开销。所以这与“如果存在动态多态性,为什么要使用静态多态性”是一样的问题。我认为当它重复很多次时会有所不同。无论如何,为什么我应该在运行时支付它,当我有编译时知道哪个函数要调用(或者不调用)。 – valentyn 2009-09-09 13:43:23