博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
泛型(三)泛型类型和继承
阅读量:5303 次
发布时间:2019-06-14

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

泛型类型仍然是类型,所以它能从其他任何类型派生,使用一个泛型类型并指定类型实参时,实际是在CLR中定义一个新的类型对象,新的类型对象是从泛型类型派生自的那个类型派生的,换言之,由于List<T>是从Object派生的,所以List<String>和List<Guid>也从Object派生。
 
类似地,由于DictionaryStringKey<TValue>派生自Dictionary<String,TValue>所以DictionaryStringKey<Guid>派生自Dictionary<String,Guid>,类型实参的指定和继承层次结构没有任何关系--理解这一点,有助于判断哪些转型是能够进行的,哪些转型是不能进行的。
 
继承
 

假定像下面这样定义一个链表节点类internal sealed class Node
{ public T m_data; public Node
m_next; public Node(T data):this(data,null){} public Node(T data,Node
next){ m_data=data; m_next=next; } public override ToString(){ return m_data.ToString()+ ((m_next!=null)?m_next.ToString():null); }}static void Main(string[] args){ Node
head = new Node
('C'); head = new Node
('B', head); head = new Node
('A', head); Console.WriteLine(head.ToString());}输出:ABC

 

在这个Node类中,对于m_next字段引用的另一个节点来说,它的m_data字段必须包含相同的数据类型,意味着在链表包含的节点中,所有数据项都必须具有相同的类型(或派生类型),不能包含即有DateTime类型又有String 类型
 
改进
 
思路:定义一个非泛型的Node基类,在定义一个泛型TypedNode类(用Node类作为基类),这样依赖就可以创建一个链表,每个节点都可以是一种具体的数据类型(非Object类型),同时防止装箱,有点递归的意思。
internal  class Node{        protected Node m_next;        public Node(Node next) {            m_next = next;        }    }    internal sealed class TypeNode
: Node { public T m_data; public TypeNode(T data) : this(data, null) { } public TypeNode(T data, Node next) : base(next) { m_data = data; } public override string ToString() { return m_data.ToString() + ((m_next != null) ? m_next.ToString() : null); } }程序入口: Node head = new TypeNode
('.'); head = new TypeNode
(DateTime.Now, head); head = new TypeNode
("Today is ", head); Console.WriteLine(head.ToString());程序输出:Today is 2012-11-23 16:33:14.

 

转载于:https://www.cnblogs.com/liuhailiang/archive/2012/11/26/2788642.html

你可能感兴趣的文章
Java NIO简介 2011-09-20 12:43 94人阅读 评论(0) 收藏...
查看>>
ubuntu虚拟内存一直保留
查看>>
ubuntu使用virualbox安装mac10.12
查看>>
git push -u origin master error: failed to push some refs to
查看>>
服务器端渲染SSR
查看>>
sql之left join、right join、inner join的区别
查看>>
垂直居中及容器内图片垂直居中的CSS解决方法
查看>>
字符编码笔记:ASCII,Unicode 和 UTF-8
查看>>
java枚举类型enum的使用
查看>>
springBoot Ribbon Hystrix
查看>>
Oracle - 拼接多个字段 - wm_concat()函数
查看>>
常识的力量 - 防止错得太远
查看>>
[dubbo实战] dubbo+zookeeper伪集群搭建
查看>>
FI & RI
查看>>
springboot(5)单元测试及MockMVC类的使用及自定义异常处理
查看>>
Repeater控件用法
查看>>
PowerShell+NetApi 批处理执行程序
查看>>
渣渣小本求职复习之路每天一博客系列——Java基础(6)
查看>>
形态学滤波(1):腐蚀与膨胀
查看>>
redis-cluster 单个节点不可用
查看>>