如何使用泛型达到代码重用的目的
创始人
2024-05-01 12:51:04
0

通过泛型,你重新获得了链接列表的代码通用(对于所有类型只用实现一次),而当你初始化链表的时候你告诉链表所能接受的类型。这个实现是非常简单的,让我们重新回到Node类:

  1. public class Node{  
  2.     Object data;  
  3.     ... 

注意到 data 的类型是Object,(在EmployeeNode中,它是Employee)。我们将把它变成一个泛型(通常,由一个大写的T代表)。我们同样定义Node类,表示它可以被泛型化,以接受一个T类型。

  1. public class Node < T>{  
  2.     T data;  
  3.     ... 

读作:T类型的Node。T代表了当Node被初始化时,Node所接受的类型。T可以是Object,也可能是整型或者是Employee。这个在Node被初始化的时候才能确定。

注意:使用T作为标识只是一种约定俗成,你可以使用其他的字母组合来代替,比如这样:

  1. public class Node < UnknownType>{  
  2.     UnknownType data;  
  3.     ... 

通过使用T作为未知类型,next字段(下一个结点的引用)必须被声明为T类型的Node(意思是说接受一个T类型的泛型化Node)。

    Node< T> next;

构造函数接受一个T类型的简单参数:

  1. public Node(T data)  
  2. {  
  3.     this.data = data;  
  4.     this.next = null;  

Node 类的其余部分是很简单的,所有你需要使用Object的地方,你现在都需要使用T。LinkedList 类现在接受一个T类型的Node,而不是一个简单的Node作为头结点。

  1. public class LinkedList< T>{  
  2.     Node< T> headNode = null; 

再来一遍,转换是很直白的。任何地方你需要使用Object的,现在改做T,任何需要使用Node的地方,现在改做 Node< T>。下面的代码初始化了两个链接表。一个是整型的。

  1. LinkedList< int> ll = new LinkedList< int>(); 

另一个是Employee类型的:

  1. LinkedList< Employee> employees = new LinkedList< Employee>(); 

剩下的代码与***个版本没有区别,除了没有装箱、拆箱,而且也不可能将错误的类型保存到集合中。

  1. LinkedList< int> ll = new LinkedList< int>();  
  2. for ( int i = 0; i <  10; i ++ )  
  3. {  
  4.     ll.Add(i);  
  5. }  
  6.  
  7. Console.WriteLine(ll);  
  8. Console.WriteLine("  Done.");  
  9.  
  10. LinkedList< Employee> employees = new LinkedList< Employee>();  
  11. employees.Add(new Employee("John"));  
  12. employees.Add(new Employee("Paul"));  
  13. employees.Add(new Employee("George"));  
  14. employees.Add(new Employee("Ringo"));  
  15.  
  16. Console.WriteLine(employees);   
  17. Console.WriteLine("  Done.");  
  18. Console.WriteLine("The fourth integer is " + ll[3]);  
  19. Employee d = employees[1];  
  20. Console.WriteLine("The second Employee is " + d); 

泛型允许你不用复制/粘贴冗长的代码就实现类型安全的集合。而且,因为,使用泛型运行时才被扩展成特殊类型。Just In Time编译器可以在不同的实例之间共享代码,***,它显著地减少了你需要编写的代码。

这样,使用泛型就达到了代码重用的目的。

【编辑推荐】

  1. C# winForm自定义鼠标样式的两种方法
  2. C#自定义消息框的设置图解
  3. 掌握C#自定义泛型类:从初始化说起
  4. C#存储过程的循序渐进
  5. 存储过程的优势及其调用方法介绍

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...