ホームページ >バックエンド開発 >C++ >共分散と反分散は C# でのインターフェイスの使用をどのように強化しますか?

共分散と反分散は C# でのインターフェイスの使用をどのように強化しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-21 15:21:10207ブラウズ

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

C# の共変インターフェイスと反変インターフェイスについての深い理解

共変性と反変性は、さまざまな型で参照がどのように使用されるかを定義するオブジェクト指向プログラミングの概念です。 C# では、<out T> および <in T> 構文を使用して、インターフェイスをそれぞれ共変または反変としてマークできます。

共分散

C# では、共分散により、インターフェイス参照を階層内の上位の型への参照として扱うことができます。たとえば、IBibble<out T> クラスが IBibble<Descendant> 型を継承している限り、インターフェイス DescendantT のインスタンス参照を割り当てることができます。これは、IBibble<T> で実行できるものはすべて IBibble<Descendant> でも実行できることを意味します。

インバータ

C# では、反変性により、インターフェイス参照を階層の下位の型への参照として扱うことができます。たとえば、IBibble<in T> 型が IBibble<Base> 型から継承している限り、インターフェイス BaseT のインスタンス参照を割り当てることができます。これは、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> は共変であるため、bDescendant オブジェクトを参照できます。インターフェース IBibbleIn<in T> は反変であり、dBase オブジェクトを参照できます。

以上が共分散と反分散は C# でのインターフェイスの使用をどのように強化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。