博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
举例说明如何实现一个泛型类
阅读量:4663 次
发布时间:2019-06-09

本文共 2735 字,大约阅读时间需要 9 分钟。

  首先,我们以“创建一个简单的、未实现泛型的、能包含任何类型的链表类”作为切入点;然后我们再对其改装成支持泛型的列表类。

  我们都知道“链表”内部总是一个元素连接到下一个元素,所以我们需要创建一个类来表示其中的每一个节点。这个节点类,需要包含三个信息:1.之前的节点 2.本节点 3.之后的节点。

  基于以上的分析,我们得到了节点类LinkedListNode:

  

ContractedBlock.gif
ExpandedBlockStart.gif
View Code
public class LinkedListNode     {
public object Value { get; private set; } public LinkedListNode(object value) {
Value = value; } public object Prev { get; internal set; } public object Next { get; internal set; } }
class LinkedList:IEnumerable     {
public LinkedListNode First { get;private set; } public LinkedListNode Last { get; private set; } public LinkedListNode AddLast(object node) {
LinkedListNode newNode = new LinkedListNode(node); if (First == null)//如果链表为空 {
First = newNode; Last = First; } else {
Last.Next = newNode; Last = newNode; } return newNode; } public IEnumerator GetEnumerator() {
LinkedListNode current = First; while (current != null) {
yield return current.Value; current = current.Next; } } }

  以下,我们对其添加新节点。可以看出几个问题:1.addLast(值类型)时,涉及到装箱过程(int->object) 2.没有类型安全:list1.AddLast(“6”); 3.foreach (int i in list1)中,涉及到拆箱过程(object -> int)

LinkedList list1 = new LinkedList(); list1.AddLast(2); list1.AddLast(4); list1.AddLast(“6”); foreach (int i in list1) {
Console.WriteLine(i); }

  现在我们对上诉两个类进行改装,使其成为支持泛型的类:

public class LinkedListNode
{
public T Value { get; private set; } public LinkedListNode(T value) {
Value = value; } public T Prev { get; internal set; } public T Next { get; internal set; } }
class LinkedList
: IEnumerable
{
public LinkedListNode
First { get;private set; } public LinkedListNode
Last { get; private set; } public LinkedListNode
AddLast(T node) {
LinkedListNode
newNode = new LinkedListNode
(node); if (First == null)//如果链表为空 { First = newNode; Last = First; } else { Last.Next = newNode; Last = newNode; } return newNode; } public IEnumerator
GetEnumerator() { LinkedListNode
current = First; while (current != null) { yield return current.Value; current = current.Next; } } }
LinkedList < int > list2 = new LinkedList < int > (); list2.AddLast(1); list2.AddLast(3); list2.AddLast(5); foreach (int i in list2) {
Console.WriteLine(i); }

  现在使用以上代码,将不会有装箱、拆箱过程中的性能损失。同时还是类型安全的,如果foreach (int i in list2)中声明的不是int,那么编译期间就会报错。

转载于:https://www.cnblogs.com/ifshe/archive/2011/08/16/2140763.html

你可能感兴趣的文章
微信开发创业交流QQ群列表
查看>>
微信小程序开发(5) 2048游戏
查看>>
LOJ-10106(有向图欧拉回路的判断)
查看>>
day06 statcic 文档的生成 静态代码块 单例设计模式
查看>>
独生子女政策对老年丧子的家庭来说,确实太残酷了
查看>>
我们绝不赞同也不鼓励赖宁这样的孩子去救火
查看>>
Python之ftp下载文件测试代码
查看>>
Flume简介与使用(三)——Kafka Sink消费数据之Kafka安装
查看>>
网页结构和表现形式
查看>>
saltstack系列(一)——介绍与安装
查看>>
php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明
查看>>
哈佛管理学———气质的培养
查看>>
es 修改拼音分词器源码实现汉字/拼音/简拼混合搜索时同音字不匹配
查看>>
Go学习笔记(二):编写 HelloWorld 程序
查看>>
视觉slam十四讲课后习题ch3-7
查看>>
adb_亮屏
查看>>
Windows默认字符集_查询
查看>>
深度学习基础1--神经网络
查看>>
深度学习基础2--神经网络参数的反向传播算法
查看>>
洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails
查看>>