泛型--转

一、泛型用途
  泛型的用途主要是实现动态类型,数据类型也作为一中参数来处理。通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率。实例化类型推迟到客户端实现时,主要用途就是代码重用。比如一种数据结构或设计模式,在没有泛型支持的时候,必须对每一种对象类型编写相似的代码才可以实现。如,一个Tree,当Node里为字条串是一个,数字是一个,其他类又是一个,这个一个Tree,就有了多种类的实现,这是不利于代码的重用和维护的。另一种变通的方法Node中包含数据的地方用object来代替,这样做的问题一是如果Data域为值类型,会造成频繁的装箱和拆箱操作,影响效率。二是类型安全问题,需要用到强制类型转换,不能对客户端代码进行适当的限制,容易出现未知的错误。
二、泛型语法
泛型用"<>"括起来,括号里面是泛型(一般类型参数)名称,在实例化时,用适当的实参代替。泛型在类上声明,在类的方法或成员声明时引用:
 public class Node<K, T>

 public someMethod(K someParameter)
{
}
... ...

三、泛型可以在不同类进行引用和传递,既一个类定义了泛型,另外一个泛型类也可以引用这个类中的泛型而实现为一个泛型类。泛型类也可以有继承关系。
四、泛型约束:
存在三个类型的约束。派生约束指示编译器一般类型参数派生自诸如接口或特定基类之类的基类型。默认构造函数约束指示编译器一般类型参数公开了默认的公共构造函数(不带任何参数的公共构造函数)。引用/值类型约束将一般类型参数约束为引用类型或值类型。一般类型可以利用多个约束,您甚至可以在使用一般类型参数时使 IntelliSense 反射这些约束,例如,建议基类型中的方法或成员。

语法:where
  派生约束:类或接口的名字 不能将 System.Delegate 或 System.Array 约束为基类。
 引用 、值约束:值约束:struct 类约束:class
  默认构造函数:new(),默认构造函数要放在其他约束之前
public class Node<K, T> where K:new(),class,IComparable where T:struct
{
}

五、示例

    public class Node<K, T> where K : IComparable
    {
        public K Key;
        public T Item;
        public Node<K,T> NextNode;
        public Node()
        {
            Key = default(K);
            Item = default(T);
            NextNode = null;
        }
        public Node(K key, T item, Node<K,T> nextNode)
        {
            Key = key;
            Item = item;
            NextNode = nextNode;
        }
    }

    public class LinkedList<K, T> where K : class,IComparable,new()
    {
        Node<K,T> m_Head;
        public LinkedList()
        {
            m_Head = new Node<K,T>();
        }
        public void AddHead(K key, T item)
        {
            Node<K,T> newNode = new Node<K,T>(key, item, m_Head.NextNode);
            m_Head.NextNode = newNode;
        }
    }

posted on 2012-04-10 16:20 青蛙學堂 阅读(191) 评论(0)  编辑 收藏 引用 所属分类: Vs2008

只有注册用户登录后才能发表评论。
<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

常用链接

留言簿(8)

随笔分类

随笔档案

收藏夹

青蛙学堂

最新评论

阅读排行榜

评论排行榜