gpt4 book ai didi

.NET:协方差和逆变

转载 作者:行者123 更新时间:2023-12-04 16:12:51 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




10年前关闭。




Possible Duplicate:
Difference between Covariance & Contra-variance



我试图了解什么是协方差和逆变,以及两者之间的区别。我看过 this link ,到目前为止,我已经了解以下内容:

协方差是将派生成员分配给基成员的过程。如:
IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;

我什至不确定我在上面是否正确......猜测。基本上,我正在寻找一个人来为我简化,用最简单的术语来说,这样我就可以理解这两者是什么以及它们之间的区别。

我也知道有关于此的类似讨论主题,但大多数答案都不是我正在寻找的那种描述。

最佳答案

在我们的内部培训中,我使用了很棒的书“Smalltalk、对象和设计(Chamond Liu)”,并且我改写了以下示例。 - 希望这可以帮助...

“一致性”是什么意思?
这个想法是设计具有高度可替换类型的类型安全类型层次结构。获得这种一致性的关键是基于子类型的一致性。
(我们将在这里高层次地讨论里氏替换原则 (LSP)。)

协方差:
让我们假设鸟类使用静态类型“一致地”下蛋:
如果 Bird 类型会下一个 Egg,那么 Bird 的子类型会不会下一个 Egg 的子类型?
例如。类型 Duck 下一个 DuckEgg,然后给出一致性。
为什么这是一致的?因为在这样的表达中:
Egg anEgg = aBird.Lay();
引用 aBird 可以合法地替换为 Bird 或 Duck 实例。
我们说返回类型与定义了 Lay() 的类型是协变的。
子类型的覆盖可能会返回更特殊的类型。 =>“他们提供更多。”

逆变:
让我们假设钢琴家可以使用静态类型“一致地”演奏钢琴:
如果钢琴家弹钢琴,她能弹奏三角钢琴吗?
不是宁愿演奏家演奏三角钢琴吗? (请注意;有一个转折!)这是不一致的!因为在这样的表达中:
aPiano.Play(aPianist);
aPiano 不能被 Piano 或 GrandPiano 实例合法地替代!三角钢琴只能由演奏家演奏,钢琴家太一般了!
GrandPianos 必须能被更一般的类型演奏,然后演奏是一致的。
我们说参数类型与定义 Play() 的类型是逆变的。
子类型的覆盖可以接受更通用的类型。 =>“他们需要的更少。”

关于.NET:协方差和逆变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6643389/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com