概念'協方差'和'逆變'的含義是什麼?協方差與類繼承的逆變關係
鑑於2班,動物和大象(從動物繼承),我的理解是,如果你試圖把大象到動物的數組,你會得到一個運行時錯誤,這是因爲大象比動物「更大」(更具體)。但是,你能否將一隻動物放入一系列大象,看看大象如何保證包含動物特性?
概念'協方差'和'逆變'的含義是什麼?協方差與類繼承的逆變關係
鑑於2班,動物和大象(從動物繼承),我的理解是,如果你試圖把大象到動物的數組,你會得到一個運行時錯誤,這是因爲大象比動物「更大」(更具體)。但是,你能否將一隻動物放入一系列大象,看看大象如何保證包含動物特性?
你擁有它倒退。您可以將大象添加到動物數組中,因爲它是是動物,並且它確保擁有動物所需的所有方法。您不能將動物添加到大象陣列,因爲它具有而不是具有大象所需的所有方法。
上covariance and contravariance維基百科的文章有一個很好的解釋:
在編程語言的類型系統,從類型到類型的操作是協變的,如果它保留了訂貨,≤,類型,它將類型從更具體的類型定義到更通用的類型;如果它逆轉這種排序,它是逆變的。如果這些都不適用,則運營商是不變的。這些術語來自類別理論。
另外,你說這種類型的大象是「更大」,事實並非如此。類型動物是「更大」的,因爲它包含更多特定的類型,如大象,長頸鹿和獅子。
您應該嘗試閱讀Introducing .NET 4.0 With Visual Studio 2010的第45-49頁,其中涉及這個確切的例子。它甚至有一些很好的大象照片。
主穴取出來就是,要做到這一點
var things = new List<IThing<IContent>> { new ConcreteThing() }
有:
public class ConcreteThing : IThing<ConcreteContent>
{
}
需要在接口定義,這將讓更多的具體形式是「走出去」設置,但是從IThing讀出的任何東西都必須保證是更一般的類型。
public interface IThing<out T> where T : IContent
{
}
有用:http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx – 2010-03-23 05:58:48
[協方差VS逆變]( http://zhlooite.blogspot.com/2011/04/covariance-and-contravariance.html) – 2011-04-11 07:59:12