关闭

c#协变-逆变复习

88人阅读 评论(0) 收藏 举报
分类:
c#中泛型同c++中的stl基本类似。
例子如下:
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");

    }
}











0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:48447次
    • 积分:1441
    • 等级:
    • 排名:千里之外
    • 原创:96篇
    • 转载:26篇
    • 译文:0篇
    • 评论:0条
    文章分类