2009-11-12 183 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