2009-09-09 63 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