以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 Dot NET,C#,ASP,VB 』 (http://bbs.xml.org.cn/list.asp?boardid=43) ---- GetStartWith C# 泛型(2) (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11904) |
-- 作者:admin -- 发布时间:11/9/2004 2:26:00 AM -- GetStartWith C# 泛型(2) 发信人: Nineteen (-_-#!), 信区: DotNET 标 题: GetStartWith C# 泛型(2) 发信站: BBS 水木清华站 (Mon Jul 12 21:46:37 2004), 站内 GetStartWith C# 泛型(2) 如果你打算比较两个个"泛型化的list"中item对象,或者调用它们的一个方法, 那么编译器就必须得保证这个方法可以调用.这种保证,是建立在对你的泛 型类(generic class)的一些约束(constraints)上的.(唉,偶表达能力比较菜, e文好的哥们还是去看e文比较好).例如,我们可以约束用于初始化该泛型类的 class必须是某种特定的class或者是从该class派生出来的,这叫做"base class constrain" . 该功能是用上下文关键字(contextual keyword -_-v)where来实现的.请看下面的代码 (我考,汗~~~~) 例如: public class Employee { private string name; private int id; public Employee(string s, int i) { name = s; id = i; } public string Name { get { return name; } set { name = value; } } public int ID { get { return id; } set { id = value; } } } //代码没有贴全,大家看那些变量也知道是什么意思,就不多说了. class MyList<T> where T: Employee { //Rest of class as before. public T FindFirstOccurrence(string s) { T t = null; Reset(); while (HasItems()) { if (current != null) { //The constraint enables this: if (current.Data.Name == s) { ~~~~~~~这里,不约束是不成的 t = current.Data; break; } else { current = current.Next; } } //end if } // end while return t; } } 当然,还有一些其他的约束类型,这些约束类型是可以用在同一个泛型类上的,如: class MyList<T> where T: Employee, IEmployee, IComparable<T>, new() {…} 类型说明: 约束 描述 where T: struct 必须是值类型 where T : class 必须是引用类型 where T : new() 必须得有一个public的没有参数的构造函数.当指定一堆约束 的时候,这个约束必须指定在最后. where T : <base class name> 这就不用说了. where T : <interface name> 必须是接口或者实现了该接口.可以指定多个接口,这些接口 也 可以是泛型 ok,就像大家猜想的一样,where T :...后面的那一坨必须得统统实现,就像上面的例子,T类 型 必须是Employee的派生类,必须实现IEmployee,IComparable<T>接口,必须具有一个没有参数 构造函数. 你不得不进行类型限制(type constraining)只是因为你在设计泛型类是用到了System.Obje ct 不提供的方法,这个也狠明显,不多说了. msdn中,谆谆教导说,如果你使用没有类型限制(type constraining)的泛型,那么你得遵守以 下 三条规则(rules) 1,!=和==是不能用地,因为具体类型可能不提供它们的实现. 2,它们可以和System.Object互相转换,或者他们实现了某一个接口. 3,他们可以和null进行比较.但是比较的时候有一点得注意:就是如果该类型是一个值类型(v alue type) 那么比较的结果总是false. 若一个泛型类型参数(generic type parameter)被作为约束的话,则它被成为"裸类型约束"( naked type constraint) 它的用法如下: class List<T> { //... void Add<U>(List<U> items) where U:T {…} } public class MyClass<T,U,V> where T : V //这种方式一般不会被用到,偶就不多说了 。 为什么这么用,狠明显,也就不多嘴了. -- 长夜漫漫,无心睡眠……饿!非常的饿...饿死我了 ~~~><~~~
|
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
46.875ms |