美文网首页
C#_泛型接口的协变与抗变

C#_泛型接口的协变与抗变

作者: 雨生_ | 来源:发表于2017-12-06 15:50 被阅读145次
前言

协变与抗变,听名字挺高大上的,其实无非就是类之间继承关系导致的一些基本问题。
我们先举个例子,首先我们有两个类,代码如下:

public class Shape
      {
          public double Width { get; set; }
          public double Height { get; set; }
          public override string ToString()
          {
              return string.Format("Height:{0},Width:{1}", Height, Width);
          }
      }

      public class Rectangle:Shape
      {
           
      }
  1. 如果现在有一个方法:public void Display(Shape shape) { },这个方法能不能传入一个Rectangle的对象呢?答案是可以,因为参数类型是协变的,通俗来讲就是可以用子类对象代替父类参数。
  2. 如果有一个方法:public Rectangle ReturnValue(){ } 需要返回一个父类的对象,可以用子类代替么?答案是不可以,因为返回值类型是抗变的,方法不能保证父类Shaper拥有所有子类Rectangle的特性,反过来可以。

这里总结一下:

通常我们在设计参数和返回值都有一个原则,参数要尽可能“泛”,返回值要尽可能的“细”。泛,指得是用接口或者父类作为参数,这样可以接收更多的参数类型;细,指的是返回具体类型,这样可以更好说明方法的作用。

但是在接口不同于以上两者,所以引入两个关键字outin来标识抗变和协变。

相关文章

  • C#_泛型接口的协变与抗变

    前言 协变与抗变,听名字挺高大上的,其实无非就是类之间继承关系导致的一些基本问题。我们先举个例子,首先我们有两个类...

  • 泛型协变与抗变(二)

    前言 在.NET 4之前,泛型接口是不变的。.NET 4通过协变和抗变为泛型接口和泛型委托添加了一个重要的扩展。协...

  • 泛型编程中的型变

    在泛型编程中,经常会提到型变。型变分为两种:协变与逆变。协变covariant表示与泛型参数T的变化相同,而逆变c...

  • Kotlin学习笔记 - 泛型

    1. 基本用法 2. 型变 型变包括 协变、逆变、不变 三种: 协变:泛型类型与实参的继承关系相同 逆变:泛型类型...

  • Scala 泛型协变与泛型边界

    代码准备 泛型协变 泛型协变、逆变、不变是指拥有泛型的类在声明和赋值时的对应关系。 协变:声明时泛型是父类,赋值时...

  • Scala 通俗易懂 ---- 协变、逆变、不变

    协变、逆变、不变 Scala 语言中协变、逆变、不变是指拥有泛型的类型,在声明和赋值时的对应关系 协变:声明时泛型...

  • JAVA泛型与类型安全

    1. 基础泛型 2. 协变与逆变与不变 协变 简单来说即: Java中的数组是协变的 逆变与协变相对,逆转了类型关...

  • Java协变和逆变

    泛型的协变与逆变 协变与逆变用来描述类型转换(type transformation)后的继承关系,其定义如下:如...

  • Java 泛型与通配符

    参考地址:《Java 泛型,你了解类型擦除吗?》 《Java中的逆变与协变》 《java 泛型中 T、E .....

  • C# 中泛型接口的协变和逆变(抗变)

    在C#中声明泛型接口时,我们可以使用 in 和 out 参数来控制这个泛型是协变还是逆变的,这里逆变有时也被翻译成...

网友评论

      本文标题:C#_泛型接口的协变与抗变

      本文链接:https://www.haomeiwen.com/subject/amleqxtx.html