深入理解C#中的協變與逆變介面
協變和逆變是物件導向程式設計中的概念,定義了引用如何與不同類型一起使用。在C#中,可以使用<out T>
和<in T>
語法分別將介面標記為協變或逆變。
協變
在C#中,協變允許將介面引用視為層次結構中更高類型的參考。例如,介面IBibble<out T>
可以賦值為IBibble<Descendant>
的實例引用,只要Descendant
類別繼承自T
型別。這意味著任何可以在IBibble<T>
上執行的操作也可以在IBibble<Descendant>
上執行。
逆變
在C#中,逆變允許將介面引用視為層次結構中較低類型的參考。例如,介面IBibble<in T>
可以賦值為IBibble<Base>
的實例引用,只要Base
型別繼承自T
型別。這意味著任何可以賦值給IBibble<Base>
的物件也可以賦值給IBibble<Descendant>
。
用途與應用
協變在處理共享公共基類型的物件集合時非常有用。透過使用協變接口,我們可以確保對基底類型執行的操作也適用於所有派生類型。
逆變在處理接受不同類型參數的工廠或委託時非常有用。透過使用逆變接口,我們可以確保任何可以賦值給基底類型的物件也可以用作工廠或委託的參數。
範例
考慮以下程式碼片段:
<code class="language-csharp">namespace SO2719954 { class Base { } class Descendant : Base { } interface IBibbleOut<out T> { } interface IBibbleIn<in T> { } class Program { static void Main(string[] args) { // 协变示例 IBibbleOut<Base> b = GetOutDescendant(); // IBibbleOut<Descendant> 赋值 // 逆变示例 IBibbleIn<Descendant> d = GetInBase(); // IBibbleIn<Base> 赋值 } static IBibbleOut<Descendant> GetOutDescendant() { return null; } static IBibbleIn<Base> GetInBase() { return null; } } }</code>
在此範例中,介面IBibbleOut<out T>
是協變的,允許b
引用Descendant
物件;介面IBibbleIn<in T>
是逆變的,允許d
引用Base
物件。
以上是協變和逆變如何增強 C# 中的介面使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!