在系统项目应用中,用户可以自行定义需要的泛型接口、泛型类、泛型方法、泛型事件和泛型委托,以便实现系统的特殊功能需求。在C#中,允许程序员自定义泛型集合类,但前提是定义的集合类必须实现System.Collections.Generic命名空间中的IEnumerable<T>和IEnumerator<T>的接口。
因为IEnumerable<T>和IEnumerator<T>分别继承了IEnumerable和IEnumerator接口,所以在实现IEnumerable<T>接口类的同时,也必须实现IEnumerable接口;而在实现IEnumerator<T>接口的同时,必须同时实现IEnumerator接口。要实现某类的IEnumerable<T>接口,必须使用如下格式的代码:
而如果想实现某类的IEnumerator<T>接口,必须使用如下格式的代码:
非泛型成员可以通过调用同名泛型成员来实现。
实例60:自定义泛型集合类实现数据处理
下面将通过一个简单实例来说明使用自定义泛型集合类实现数据处理的过程。本实例保存在“光盘:\daima/13”文件夹内,项目名为dingyi。本实例的功能是,向对象列表内添加数据,并输出显示处理后的列表数据。实例文件的主要代码如下所示:
上述实例代码的设计流程如下。
1)通过using调用System.Collections.Generic类,定义命名空间zidingyi。
2)自定义泛型类mm,设置同时实现和IEnumerabl、IEnumerator的接口。
3)设置变量aa和index的初始值。(www.xing528.com)
5)定义类mm的构造函数,并设置其ArrayList类型成员qiuduis,用于存储数据。
6)分别实现方法Rset()、MoveNext()和GetEnumerator()的处理。
7)定义自定义类mm的成员club,用于存储数据。
8)通过方法Add()向club内添加五个数据。
9)使用foreach将当前的数据输出显示。
上述实例代码执行后,将输出显示添加处理后的数据,具体如图13-3所示。
在上述代码中,因为IEnumerable<T>继承了IEnumerable,所以类qiudui必须实现泛型和非泛型版本的Get IEnumerator。并且在实现非泛型版本的Get IEnumerator和Current时,使用显式接口成员。
图13-3 实例执行结果
多学一招
因为泛型类的定义会放在程序集中,所以用某个类型实例化泛型类不会在IL代码中复制这些类。但是,在JIT编译器把泛型类编译为内部代码时,会给每个值类型创建一个新类。引用类型共享同一个内部类的所有实现代码。这是因为引用类型在实例化的泛型类中只需要4字节的内存单元(32位系统),就可以引用一个引用类型。值类型包含在实例化的泛型类的内存中。而每个值类型对内存的要求都不同,所以要为每个值类型实例化一个新类。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。