剖析C# 2.0泛型类的创建和使用(二)
一种合理的实现某种新功能的方法是在原有的事物上进一步构建。我们已经了解强类型集合,并知道一种不错的用来构建泛型类的技术是使用一个特定类并删除数据类型。也就是说,让我们定义一个强类型集合CustomerList,并且来看一下它要把什么东西转化成一个泛型类。
列表2定义了一个类CustomerList。后面的部分把CustomerList转化成List<T>。
列表2定义类CustomerList:
using System;
using System.Collections;
using System.Text;
namespace Generics{
public class CustomerList : CollectionBase{
public CustomerList() { }
public Customer this[int index]{
get { return (Customer)List[index]; }
set { List[index] = value; }
}
public int Add(Customer value)
{return List.Add(value);}
}
}
四、 定义类头
如果我们定义一个泛型类,我们需要把类头转化成一个泛型类。所有我们需要做的是命名参数并且把类名改成某种泛型。List<T>只有一个参数T,并且因为我们在以一种向后兼容的方式工作,所以我们知道类名是List。列表3显示出列表2中类的新类头。
列表3 一个泛型类头显示出参数化的参数T。
using System;
using System.Collections;
using System.Text;
namespace Generics{
public class List<T> : CollectionBase {}
五、 实现泛型字段
如果我们需要把任何字段转换成泛型字段,我们将只需简单地把它们的类型改变成T(或该字段所描述的任何参数)。泛型List不需要任何字段,但是假定存在一个私有的整型字段叫foo-我们将把它泛型化。我们将如下重新定义它:
private T foo;
当参数T被填充到类中时,List T也将因foo被填充。
六、 定义泛型方法
接下来,我们为所需要的参数化类型定义其它一些特性。这包括属性,方法,和事件。在我们的实例中,在Customer出现的每一处,我们都用参数T替换它。完成后的泛型列表类显示于列表4中。
列表4 一个基于System.Collections.CollectionBase的轻量级的参数化泛型列表类。
using System;
using System.Collections;
using System.Text;
namespace Generics{
public class List<T> : CollectionBase {
public List(){ }
public T this[int index] {
get { return (T)List[index]; }
set { List[index] = value; }
}
public int Add(T value) {
return List.Add(value);
}
}
}
为了测试该定制列表,注释掉使用System.Collections.Generic命名空间一句并且把列表4中的List<T>使用在列表1的代码中;它将以同样的方式工作。
全面地修改.NET的List<T>是不必要的而且它也包含远比我们的示例多得多的特性;但是列表4显示出这种机制对于定义定制泛型类是多么容易。