C#:是差异(差/逆)另一个词,用于多?
-
21-08-2019 - |
题
我试图找出确切含义的话 Covariance
和 Contravariance
从若干条款在线和个问题上的计算器,以及从什么我可以理解,它是唯 另一个词,用于多.
我是正确的,与上述声明?或者是我听错了?
解决方案
这当然涉及到多态。我不会说他们只是“另一种说法”的多态性,但 - 他们的很具体的情况,在那里你可以把一个类型,就好像它是在一定的语境另一种类型的 的<。 / p>
例如,对于正常的多态,你可以把一个Banana
作为对Fruit
参考任何参考 - 但是,这并不意味着可以替代Fruit
的每一个的时候,你看到的类型Banana
。例如,List<Banana>
不能因为List<Fruit>
有效期为list.Add(new Apple())
但不能用于List<Fruit>
视为List<Banana>
。
协方差允许“更大”(较不具体的)键入API中被取代,其中原先类型是仅在“输出”位置(例如,作为返回值)使用。逆变允许“较小”(更具体的)类型的API,其中原先类型是在要被替换的仅在“输入”的位置使用。
这是很难进入的一个SO后的所有细节(虽然希望别人会做得比这更好的工作!)。埃里克利珀具有优良的系列博客文章中了解它。
其他提示
感谢所有的喊话,各位。
乔恩和拉斯穆斯的回答都很好,我想补充一个快速的技术说明。
当随便和非正式地说,是的,人们用“方差”和“逆变”是指一种特定的多态性。也就是说,当你把蜘蛛的序列,就好像是动物的序列中的多态。
是我们得到的所有计算机sciency,努力使更多的技术定义,那么我可能不会说,协方差和逆变是“一种多态性”。我将接近一个更技术性的定义是这样的:
首先,我要注意,在C#两种可能的多态性,你可能会说什么,而不是迷惑他们是很重要的。
第一种传统上称为“特设多态性”,这就是多态性位置有一个方法M(动物x)和传递蜘蛛和长颈鹿,袋鼠到它,并且该方法均匀地把其传入的通过使用由动物基类保证共性参数的方式相同。
在第二种传统上称为“参数多态性”,或“通用多态性”。这是使一个通用的方法M<T>(T t)
,然后将该再有一堆的方法代码的能力,把均匀地基于通过对T中的约束保证共性的论点。
我觉得你是在谈论第一种多态性。但我的观点只是我们可以定义多态性作为编程语言的至的能力治疗均匀地基于已知的通用性不同的事情。(例如,已知的基类型,或已知的实现的接口)。
协方差和逆变是一种编程语言的至采取从他们的类型参数已知共性推导出的通用类型之间的共性的优点的能力。
可以考虑共和逆变为多态性的一种高级形式。不仅可以使用一个子类,就好像它是其父级,具有共和逆变,多态性延伸到涉及多晶型类的类。
想象两类:
public class Pet { /*...*/ }
public class Cat:Pet { /*...*/ }
多态性是能够使用Cat
作为Pet
:
void Feed(Pet pet) { /* ... */ }
Cat cat = ...
Feed(cat);
CO-和逆变用于谈论能够使用一个ICollection<Cat>
作为ICollection<Pet>
(协方差):
void FeedAll(ICollection<Pet> pets) { /* ... */ }
List<Cat> cats = ...
FeedAll(cats);
或使用一个Action<Pet>
作为Action<Cat>
(逆变):
Action<Pet> GetFeeder() { /* ... */ }
Action<Cat> feeder = GetFeeder();
埃里克利珀写了一篇精彩的博客一系列关于它,当他们第一次设计特点。第一部分是这里。
我觉得是特殊的多态性的不是它的另一个字。它是多态性的代表强>其中用碱的返回类型的代表可以接受子类型。