interface IData{void method();} interface IOperation<T> where T : IData{ void Run(T data);} 然后我們分別定義不同類型的數(shù)據(jù)和操作類:
代碼 class AddData : IData{ public int A1, A2; public void method() { } } class Add : IOperation<AddData>{ public void Run(AddData d) { Console.WriteLine(d.A1 + d.A2); } } class ComplexData : IData{ public void method() { } public int A1, A2, B1, B2; } class ComplexAdd : IOperation<ComplexData>{ public void Run(ComplexData d) { Console.WriteLine("{0}+{1}i",d.A1 + d.A2,d.B1+d.B2); } } 這里如果能這樣使用我們認(rèn)為應(yīng)該是安全的:
IOperation<IData> oPR = new Add(); opr.Run(data1); opr = new ComplexAdd(); opr.Run(data2);
另外一個值得注意的約束關(guān)鍵字是new(), new 關(guān)鍵字意味著泛型對象必須提供一個無參構(gòu)造函數(shù),需要注意的是,new()約束必須放在所有約束的最后面。這個約束有時會有用,不過有時看起來更像雞肋。首先,new()約束雖然表明你可以在類中對泛型對象使用new()操作符實(shí)例化對象,然而在CIL對該對象的實(shí)例化仍然是通過反射來實(shí)現(xiàn)的,即T a=new T()相當(dāng)于T a = System. Activator. CreateInstance<T>();這樣程序效率會有所降低。另一方面,目前new約束僅僅支持無參構(gòu)造函數(shù)的約束,而無法支持用戶自定義參數(shù)的構(gòu)造函數(shù)約束,雖然用戶可以自己通過工廠方法來傳遞參數(shù),但終究不夠自由,這讓new()約束有時沒太大用武之地。
約束不支持委托和枚舉類型,例如,你不能這樣定義:class ClassA<T> where T:Delegate. 這是由于委托和枚舉被認(rèn)為是特殊的類,它無法被指定為類型參數(shù)。編譯器無法根據(jù)Delegate來完成編譯器的類型檢查。