C#中的协变性与逆变性 - Part One

原文地址

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


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

首先,我们需要理解对于任意两个类型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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值