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
- C#中的协变性与逆变性
- C#中的协变性与逆变性, Part Two: 数组协变性
- C#4.0中的新功能:协变性和逆变性
- 浅谈C#4.0协变性与逆变性
- c#中的协变性与逆变性,Part Three:方法组转换的可变性
- C#的协变性和逆变性
- Java 协变性 逆变性
- java里的协变性与逆变性
- Java 协变性 逆变性 学习笔记
- java 协变性 逆变性 学习笔记
- 数组的协变性与范型的不可变性
- C#4.0新特性(3):变性 Variance(逆变与协变)
- 并发与不可变性
- 并发与不可变性
- C# 字符串的不可变性
- 深入理解泛型(二) 协变性和逆变性
- JavaScript中的不可变性(Immutability)
- java 协变性和兼容性
- java调用cmd执行maven命令
- SSL1662 家庭问题(并查集)
- html总结
- dataframe 使用心得记录
- JRE 与JDK的区别
- C#中的协变性与逆变性
- 四柱汉诺塔
- 原生DOM接口学习之实现表格的排序
- 字符编码:ASCII,Unicode和UTF-8
- JavaScript数组forEach循环
- Java回调函数的一种理解
- flasky-sqlalchemy数据库
- 两种好用的占位图
- 使用1角分高程数据为OpenStreetMap服务器添加海洋等深线