首頁 > 後端開發 > C++ > 協變和逆變如何增強 C# 中的介面使用?

協變和逆變如何增強 C# 中的介面使用?

Mary-Kate Olsen
發布: 2025-01-21 15:21:10
原創
207 人瀏覽過

How Do Covariance and Contravariance Enhance Interface Usage in C#?

深入理解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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板