以文本方式查看主题

-  中文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  //这种方式一般不会被用到,偶就不多说了


为什么这么用,狠明显,也就不多嘴了.





--
长夜漫漫,无心睡眠……饿!非常的饿...饿死我了 ~~~><~~~                           


※ 来源:·BBS 水木清华站 http://smth.org·[FROM: 211.157.101.*]                 


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms