zoukankan      html  css  js  c++  java
  • 协变抗变

    >协变与抗变(逆变)

    >总说 协变就是从子类型到父类型的变化,顺着来叫着协变,如 Shape s=new Rectangle();

    抗变就是从类型到子类型的变化,逆着来叫抗变,这种情况的例子很少

    >委托中的协变和抗变 可以用一句语来说明 在委托中返回类型支持协变的,参数类型是支持抗变

    的。

    比如 delegate Shape D(); //要返回Shape的方法才能接受 //但是因为委托返回类型支持协变,所以 Rectangle Foo(){}

    D d=Foo;//这样是可以,因为返回值是协变的 可以参考Shape s=new

    Rectangle();

    //下面看参数类型支持抗变 delegate void D(Rectangle r); //安理这里要接受Rectangle类型的方法

    才行,但是因为委托参数支持抗变,所以 void Foo(Shape s){}

    D d=Foo; //这样也是可以的。

    >再看泛型接口中的协变坑变  在有了前说明的基础上就好理解这个了,刚才说了委托返回值是协变的,

    参数是抗变的。所以泛型接口定义中out,in两个关键字来支持协变和抗变。 比如 public interface IX<out T>{} 这个接口是支持协变的 那么 我们可以这样用 IX<Rectangle> bbb=new X<Rectangle>(); IX<Shape> aaa=bbb;//协变

    public interface IX<in T>{} 这个接口是支持抗变的 那么 IX<Shape> bbb=new X<Shape>(); IX<Rectangle> aaa=bbb;//抗变

    >还有一部分是泛型委托中的协变抗变 同理 public delegate T D<out T>();这个是协变的 public delegate void D<in T>();这个是抗变的 所以 D<Rectangle> b=xxx; D<Shape> a=b; 下面个可以 D<Shape> b=xxx; D<Rectangle> a=b;

    其实大体分成两类,一类是委托的协变和逆变 一类是泛型的协变和抗变,泛协里面就是接口和委托泛型 微软恰恰把泛型这一部分叫协变和抗变,把委托的叫协变和逆变,难道这是

    区分一下?不过这样子读也恰好简单的分类一下吧。

    -----------------------

    又改动了一下,之前理解有误啊,现在不知道正确否,如果有大神看见不对的地方望指正。

    -----------------------------------------------------

    [2017-06-14]

    返回值协变,参数抗变 分别用out in;

  • 相关阅读:
    如何在Ubuntu下安装”.deb“、”.bin“、”.tar.gz“、”.tar.bz2“格式的软件包!
    安装tar.bz2文件
    tiny6410nfs挂载问题
    tiny6410SDK制作NFS文件系统
    linux压缩解压
    tiny6410的linux操作系统实验开发
    ubis文件系统的制作
    motion移植
    linux系统调用函数---12
    LED驱动程序分析
  • 原文地址:https://www.cnblogs.com/gw2010/p/3449400.html
Copyright © 2011-2022 走看看