首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于类继承的协方差与反向方差

关于类继承的协方差与反向方差
EN

Stack Overflow用户
提问于 2008-11-07 15:26:11
回答 4查看 3.3K关注 0票数 6

“协方差”和“反方差”概念的含义是什么?

给定两个类,和 Elephant (继承自),我的理解是,如果尝试将大象放入一个动物数组中,您将得到一个运行时错误,这是因为大象比动物“更大”(更具体)。但是你能把一只动物放到大象的数组中,看看大象是如何保证包含动物属性的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-07 15:31:34

你倒过来了。您可以向动物数组中添加大象,因为它是一个动物,并且保证它拥有动物所需要的所有方法。不能将动物添加到大象数组中,因为它确实具有,而不是,它拥有大象所需的所有方法。

维基百科关于协方差与反方差的文章对此有很好的解释:

在编程语言的类型系统中,如果一个从类型到类型的操作符保留类型的排序(≤),则它是协变的,它将类型从更具体的类型排序到更一般的类型;如果它逆转了这种顺序,则是相反的。如果这两种方法都不适用,则运算符是不变的。这些术语来自范畴理论。

另外,你说大象“更大”,但事实并非如此。类型动物是“更大”的意义上,它包括更具体的类型,如大象,长颈鹿,和狮子。

票数 10
EN

Stack Overflow用户

发布于 2008-11-07 15:31:28

请看一下C# 4.0中协方差和反向方差的概述,看看这是否有帮助:

http://blogs.msdn.com/charlie/archive/2008/10/27/linq-farm-covariance-and-contravariance-in-visual-studio-2010.aspx

票数 2
EN

Stack Overflow用户

发布于 2012-10-17 00:43:22

您应该尝试阅读用Visual 2010介绍.NET 4.0的45-49页,其中涉及到了这个精确的示例。它甚至有一些大象的好照片。

主要的目的是,做这个。

代码语言:javascript
复制
var things = new List<IThing<IContent>> { new ConcreteThing() }

通过以下方式:

代码语言:javascript
复制
public class ConcreteThing : IThing<ConcreteContent>
{

}

您需要接口定义中的" out“,这将允许设置更具体的表单,但是必须保证从IThing中读取的任何内容都是更通用的类型。

代码语言:javascript
复制
public interface IThing<out T> where T : IContent
{
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/272428

复制
相关文章

相似问题

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