C#中的协变性与逆变性

来源:互联网 发布:ts合并软件 安卓版 编辑:程序博客网 时间:2024/05/19 06:49

原文地址

这篇博客很著名,应该有很多人翻译过了..但是忍住想自己翻译一下。


“协变性”和“逆变性”是什么意思?

首先,我们需要理解对于任意两个类型T和U,下面必有一个陈述是正确的(下文会用到这4个陈述):

  • T比U要大 1
  • T比U要小 2
  • T和U相等 3
  • T和U无关 4

举个例子,想一下由Animal, Mammal, Reptile, Giraffe, Tiger, Snake和Turtle组成的类型结构。很明显,Mammal类型比Giraffe要大,但是比Animal要小,和Mammal相等,但是Mammal和Repitle无关。

这和可变性又有什么关系呢?假如你有一个变量,变量是一个存储地址。C#中的存储地址都有与之联系的类型。运行时,你可以在那个地址存储一个相等类型的实例,或者是更小的类型的实例。换句话说,Mammal类型变量可以存储Giraffe实例,但是不能存储Turtle。

在一个地址存储相关类型的对象是“替换原则”的一个具体例子。替换原则就是你可以用一个子类实例代替父类实例。

现在我们可以讲讲变化性。考虑一个作用于多个类型的操作。假设这个操作作用于任意类型T和U的结果是T’和U’,如果T’和U’之间的关系与T和U之间的关系相同,那么这操作就是“协变性的”。如果这个操作逆转了结果的大小关系(陈述1和2),但是保持了相等性(陈述3)和无关性(陈述4),那么就说这个操作是“逆变性的”。

这听起来咬文嚼字,也许还不太清楚,下次我们看看C#3怎么实现变化性。

0 0