今天总结了一下的C#泛型程序设计,就觉得其实C#中的所谓的泛型程序设计和C++中相对应的模版、
泛型设计的功能和机制是很相似的,在C++中有“函数模版 ”和“类模版 ”,而在C#中则有相应的“泛型方法”和“泛
型类”。
A:先说说“泛型方法”吧,C#中的泛型方法是指使用了类型参数的方法成员,
For example:
public static void Swap<T>(ref T x,ref T y)
{
T tmp = x;
x = y;
y = tmp;
}
int a = 1;
int b = 2;
Swap<int>(ref a,ref b);//调用泛型方法 显示为参数类型指定具体类型
Swap( ref a,ref b);//调用泛型方法 由C#编译器根据传递给方法的参数来自动判断参数类型的具体类型。
同时在使用“泛型方法”时需要说明的几点是:
一、泛型方法也可以对其参数类型进行类型限制其中包括:主要限制、次要限制、函数限制;(关于类型限制在后面的泛型类中详解)
二、C#中是不允许对类的构造函数、属性、事件、索引函数和操作符等特殊函数定义为泛型方法的。
三、泛型方法也可以被定义为虚拟方法、重载方法、抽象方法或密封方法等,泛型方法也可以实现override重载的,当然也能利用其
实现多态,还有一点就是在派生类中重载基类中的泛型方法时,会自动继承基类中泛型方法的所有类型限制,没有必要再去重新声明一遍
四、泛型方法也是可以通过委托机制来调用的,其实现机制有两种,分别是:“普通委托”和“泛型委托”,
For example:
public static void Swap<T>(ref T x,ref T y)
{
T tmp = x;
x = y;
y = tmp;
}
public static void Clear<T>(ref T x, ref T y)
{
x = default(T);
y = default(T);
}
普通委托:
public delegate void fun(ref int x, ref int y);
int a = 1;
int b = 2;
fun fun1 ;
fun1 = Swap<int>;
fun1(ref a,ref b);
泛型委托:
public delegate void Fun<T>(ref T x,ref T y);
Fun<int> fun2;
fun2 = Swap<int>;
fun2(ref a,ref b);
B:泛型类和泛型接口
For example:
class LinkNode<T>
{
protected T data;
protected LinkNode<T> next;
//没有用指针实现链表而是直接用存储下一个对象的方式构成了,链表结构。
public T Data {
get { return data; }
set { data = value; }
}
public LinkNode<T> Next {
get { return next; }
set { next = value ; }
}
public LinkNode()//无参构造函数
{
//通过关键字default来获取“抽象型”变量的默认值
data = default(T);
}
public LinkNode(T t)//带参构造函数
{
data = t;
}
//向后移动n个节点
public static LinkNode<T> operator>>(LinkNode<T> node ,int n)
{
LinkNode<T> node1 = new LinkNode<T>() ;
node1 = node;
for (int i = 0; i<n;i++ )
{
node1 = node.next;
}
return node1;
}
public static bool operator==(LinkNode<T> t1,LinkNode<T> t2)
{
//return (t1.Data ==t2.Data);
//错误不能直接将比较符运用到未知类型的T类型中
//但是可以直接利用object类中的比较方法如Equals();
return (t1.Data.Equals(t2.Data));
}
}
有上面的这个例子可以看出在写泛型类或泛型接口有几点要注意的就是:
一、泛型类的构造函数名称是与类名同名的,并不包括类型参数。
二、不能随意的在泛型类中将比较符等运算符运用于类型参数的对象中,这样是一定会报错的,但是如果是运用object类中的相关方法则是行的。
三、在一个泛型类中是可以使用多个泛型参数的。
四、泛型类本身是不能拥有任何东西的,而只有泛型类的构造类型和其具体实例才能拥有成员方法或数据成员的。而在C#中泛型类中的静态成
员则是属于该泛型类的构造类型。
五、无论是在写泛型类、泛型接口或泛型方法时都可以加上类型限制,即C#支持在泛型定义过程中通过where关键字来对类型参数进行限制,限制
方式主要包括:主要限制(可以限制为struct值类型或class引用类型)、次要限制(限制该类型参数必须从指定的基类或几口继承而来)、构造函数限制
(要求类型参数的目标类型必须提供一个无参的构造函数),我个人觉得这儿的类型限制其实在C#的程序设计中提供了极大的方便,这个是C++中的模版
所不能及的,但这也同时牺牲了一定的灵活性。
六、由泛型类所 引发的泛型类的继承问题,在泛型类之间的继承中有一条最基本的原则就是:“开放类型不能做为封闭类型的基类”,说白了也就是说
在普通类继承泛型类时,非泛型的普通类是不能直接继承自泛型类的,但能继承自泛型类的封闭构造函数。我个人总结就是在继承的过程中类的“开放性”
不能变小,但能不变或变大。