c#中泛型同c++中的stl基本类似。
例子如下:
为了能使泛型接口引用子类对象时使用object类型来接受其它类型的对象,引入协变,例子如下
总结一句话就是:object类型的接口来引用其它类型的对象时使用协变
与之相反的是:其它类型的对象来引用object类型的对象时使用逆变
注意:两者都是建立在泛型接口的基础之上的。
以下是逆变的例子:
例子如下:
using System;
class Test
{
public static void Main()
{
int a = 1, b = 2;
string s1 = "ni", s2 = "hao";
swap(ref a,ref b); //调用泛型的方法
swap(ref s1, ref s2);
Console.WriteLine(a + " " + b);
Console.WriteLine(s1 + s2);
}
public static void swap<T>(ref T a, ref T b) //定义一个泛型的方法
{
T temp;
temp = a;
a = b;
b = temp;
}
}
为了能使泛型接口引用子类对象时使用object类型来接受其它类型的对象,引入协变,例子如下
using System;
interface IWrapper<T> //定义一个泛型接口
{
void SetData(T data);
}
interface IRestore<out T> //定义一个协变的泛型接口
{
T GetData();
}
class Wrapper<T> : IWrapper<T>,IRestore<T> //创建一个泛型类
{
private T storedData; //返回这个数据
void IWrapper<T>.SetData(T data)
{
this.storedData = data;
}
T IRestore<T>.GetData()
{
return this.storedData;
}
}
class Test
{
public static void Main()
{
Wrapper<string> wrapper = new Wrapper<string>();
IWrapper<string> Iwr = wrapper;
Iwr.SetData("nihao"); //使用接口调用子类对象
IRestore<object> irestore = wrapper; //通过协变可以接受string类型的对象
Console.WriteLine(irestore.GetData());
}
}
总结一句话就是:object类型的接口来引用其它类型的对象时使用协变
与之相反的是:其它类型的对象来引用object类型的对象时使用逆变
注意:两者都是建立在泛型接口的基础之上的。
以下是逆变的例子:
using System;
interface SetData<in T> //使用逆变
{
void setdata(T data);
}
interface GetData<out T> //使用协变
{
T getdata();
}
class mytest<T> : SetData<T>, GetData<T>//继承两个泛型接口
{
private T data;
public void setdata(T data)
{
this.data = data; //赋值
}
public T getdata()
{
return this.data; //取数据
}
}
class Test
{
public static void Main()
{
mytest<object> my = new mytest<object>();
SetData<string> set = my;
set.setdata("nihao");
}
}