C# 4.0中的协变和逆变(一)

在刚刚落下帷幕的PDC上,我们得到了很多振奋的消息,包括C# 4.0及VS2010等等。Anders Liu 已经 将C# 4.0 新特性白皮书翻译了 出来,那里面有非常详细的介绍。

C#的发展是很快很快的,C#的设计目的是成为一个有趣有用通用的程序语言,并因此让使用该语言的用户能获得更大的成功。所以,C#除了面向对象的基本特征外,现在引入了相当多的其他特征喔!

动态,动态。动态是目前超级流行的词汇。C#也要动起来了喔!

C# 4.0的主要主题是动态编程。对象的意义变得越来越“动态”,它们的结构和行为无法通过静态类型来捕获,或者至少编译器在编译程序时无法得知对象的结构和行为。

相关的特性有动态查找命名参数可选参数等。

还有,简化了与COM的互操作

还有,协变逆变 Covariance and contravariance

这些都在白皮书里可以找到介绍。我在这里整理一下协变和逆变的一些参考资料,本来数学就不好,怕过一两天就又忘了,俗话说,好记性不如烂笔头嘛。

首先看看问题的引入。

这里有两个类型,T 和 U,在这两个类型间,以下伪表达式肯定有一个是“真”:

  • T > U
  • T < U
  • T = U
  • T 和 U 没有任何关系

例如有这些类型:动物 Animal哺乳动物 Mammal爬行动物 Reptile长颈鹿 Giraffe老虎 Tiger蛇 Snake海龟 Turtle,它们之间的继承关系应该来个UML就一目了然了有:哺乳动物动物的一个子类,长颈鹿哺乳动物的一个子类等等……

看图:

那么就有:哺乳动物长颈鹿大,比动物小,等于哺乳动物,和爬行动物却没有关系(这里的比较都不是对象之间的比较,要注意哦。

呃,如果这个难于理解,我们再看看程序中的情况。假设有一个变量,这个变量在C#中有一个容身之处(不是说的存储区的物理地址),每一个变量在C#中的容身之处都对应一个类型(强类型语言就是这样的),那么,在运行时你可以在一个特定的容身之处存储对应类型的实例或者小于这个类型的类型的实例拗口-,-)。所以呢,哺乳动物对象对应的容身之处可以存储一个长颈鹿,但是不能存储一个海龟。(考虑面先接口编程和抽象基类的思想

容身之处这个例子说明的是“交换原则”,跟面向接口编程和抽象基类的机制很类似,也就是在很多地方,我们用子类代替基类(或接口或抽象类)来使用。

现在来定义什么是协变:一个操作如果在 T 和 U 两个类型上执行后返回的 T' 和 U' 之间的关系跟原来的 T 和 U 之间的关系(上面那4个伪表达式)相同,则这个操作就叫做协变。英文名:Covariance

再看看什么是逆变:一个操作如果将 T 和 U 的大小关系改变了(大变小,小变大 - 逆转),但是不改变 T 和 U 之间的相等或不相干这两个关系,则这个操作就叫做逆变。英文名:Contravariance

呃呃。变来变去,头已经晕了。

(还没完,等我喔!)

posted @ 2008-11-14 17:00  亮小猪  阅读(1496)  评论(1编辑  收藏  举报