首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#:方差(协方差/反方差)是多态性的另一个词吗?

C#:方差(协方差/反方差)是多态性的另一个词吗?
EN

Stack Overflow用户
提问于 2009-07-03 08:46:15
回答 5查看 7.3K关注 0票数 44

我试图从几篇在线文章和关于Covariance的问题中找出Contravariance这两个词的确切含义,从我所能理解的方面来看,它只是(多态性的另一个词)。

我的上述说法正确吗?还是我弄错了?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-07-03 09:03:42

这当然与多态有关。我不会说它们只是多态性的“另一个词”--它们是关于非常特殊的情况的,在这种情况下,你可以把一种类型当作在特定环境下的另一种类型。

例如,使用正常的多态性,可以将对Banana的任何引用视为对Fruit的引用,但这并不意味着每次看到Banana类型时都可以替换Banana。例如,List<Banana>不能被视为List<Fruit>,因为list.Add(new Apple())List<Fruit>有效,但对List<Banana>无效。

协方差允许在API中替换“更大”(不太具体)类型,其中原始类型仅用于“输出”位置(例如作为返回值)。反方差允许在API中替换“更小”(更具体)类型,其中原始类型仅在“输入”位置使用。

很难在一篇这样的帖子中详细介绍所有的细节(尽管希望其他人能做得比这更好!)埃里克·利珀特( excellent )对此有一个很好的博客系列文章

票数 70
EN

Stack Overflow用户

发布于 2009-07-03 14:57:35

谢谢你这么大声喊,伙计们。

乔恩和拉斯穆斯的答案很好,我只想补充一个快速的技术说明。

当随意和非正式地说话时,是的,人们用“协方差”和“反方差”来指某种特定的多态性。也就是说,你对待蜘蛛序列的多态性,就像对待动物序列一样。

如果我们得到所有的计算机科学,并试图作出更多的技术定义,那么我可能不会说协方差和反方差是“一种多态”。我会提出这样一个更技术性的定义:

首先,我要指出的是,在C#中有两种可能的多态性,您可能正在讨论,而且重要的是不要混淆它们。

第一类传统上被称为"ad多态“,这是一种多态,其中有一个方法M(动物x),你把蜘蛛、长颈鹿和瓦拉比传递给它,这个方法通过使用由动物基类保证的共性,统一地对待它传递的参数。

第二类传统上称为“参数多态”或“泛型多态”。这是一种使泛型方法M<T>(T t),然后在方法中有一堆代码的能力,同样,基于T上的约束所保证的共性,统一地对待参数。

我想你说的是第一种多态性。但我的观点是,我们可以将多态性定义为编程语言基于已知的共同性统一处理不同事物的能力。(例如,已知的基类型,或已知的已实现接口。)

协方差和反方差是编程语言利用从其类型参数的已知共性推断出的泛型类型之间的共性的能力。

票数 49
EN

Stack Overflow用户

发布于 2009-07-03 09:14:55

您可以将协方差和反向方差看作是一种高级的多态性形式。您不仅可以像使用其子类一样使用它的父类,具有协方差和逆方差,多态扩展到与多态类相关的类。

想象一下两个类:

代码语言:javascript
复制
public class Pet { /*...*/ }
public class Cat:Pet { /*...*/ }

多态可以将Cat用作Pet

代码语言:javascript
复制
void Feed(Pet pet) { /* ... */ }

Cat cat = ...
Feed(cat);

协方差和反向方差用于谈论能够将ICollection<Cat>用作ICollection<Pet> (协方差):

代码语言:javascript
复制
void FeedAll(ICollection<Pet> pets) { /* ... */ }

List<Cat> cats = ...
FeedAll(cats);

或者使用Action<Pet>作为Action<Cat> (反向方差):

代码语言:javascript
复制
Action<Pet> GetFeeder() { /* ... */ }

Action<Cat> feeder = GetFeeder();

Eric在他们第一次设计这个特性的时候写了一个很棒的博客系列。第一部分是这里

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1078423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档