Bri*_*ham 6 .net covariance contravariance
可能重复:
协方差和反差方差之间的差异
我试图了解协方差和逆变是什么,以及两者之间的差异.我看过这个链接,到目前为止我已经理解了以下内容:
协方差是将派生成员分配给基本成员的过程.如:
IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;
Run Code Online (Sandbox Code Playgroud)
我甚至不确定我是否在上面......猜猜.基本上我正在寻找一个为我愚蠢的人,用最简单的术语让我能理解这两者是什么以及它们之间的区别.
我也理解有相关的讨论主题,但大多数答案并不是我想要的那种描述.
对于我们的内部培训,我参考了精彩的书“Smalltalk、对象和设计(Chamond Liu)”,并重新表述了以下示例。- 希望这可以帮助...
\n\n\xe2\x80\x9cconsistency\xe2\x80\x9d 是什么意思?\n这个想法是设计具有高度可替换类型的类型安全类型层次结构。获得这种一致性的关键是基于子类型的一致性。\n(我们将在这里高级讨论里氏替换原则(LSP)。)
\n\n协方差:\n让我们假设 Birds 下蛋 \xe2\x80\x9c 一致\xe2\x80\x9d 具有静态类型:\n如果 Bird 类型下蛋,Bird 的子类型不会下蛋的子类型鸡蛋?\n例如 Duck 类型产下一个 DuckEgg,然后给出一致性。\n为什么会一致?因为在这样的表达式中:\n \nEgg anEgg = aBird.Lay();\n\n引用 aBird 可以合法地被 Bird 或 Duck 实例替换。\n我们说返回类型与定义 Lay() 的类型是协变的。\n一个子类型\' s 重写可能会返回更专业的类型。=> \xe2\x80\x9c他们提供更多。\xe2\x80\x9d
逆变:\n让我们假设钢琴家可以使用静态类型一致\xe2\x80\x9c一致地\xe2\x80\x9d演奏钢琴:\n如果钢琴家演奏钢琴,她能演奏三角钢琴吗?\n不会\'t而是演奏大钢琴的演奏家?(请注意;有一个转折!)这是不一致的!因为在这样的表达式中:\n \naPiano.Play(aPianist);\n\naPiano 不能合法地被 Piano 或 GrandPiano 实例替代!三角钢琴只能由演奏家演奏,钢琴家太笼统了!\n三角钢琴必须能够被更一般的类型演奏,这样演奏才一致。\n我们说参数类型与类型是逆变的,其中定义了 Play() .\n子类型的覆盖可以接受更通用的类型。=> \xe2\x80\x9c他们需要更少。\xe2\x80\x9d
| 归档时间: |
|
| 查看次数: |
653 次 |
| 最近记录: |