Heim >Backend-Entwicklung >C++ >Wie verbessern Kovarianz und Kontravarianz die Schnittstellennutzung in C#?
Umfassendes Verständnis kovarianter und kontravarianter Schnittstellen in C#
Kovarianz und Kontravarianz sind Konzepte in der objektorientierten Programmierung, die definieren, wie Referenzen mit verschiedenen Typen verwendet werden. In C# können Sie die Syntax <out T>
und <in T>
verwenden, um eine Schnittstelle als kovariante bzw. kontravariante zu markieren.
Kovarianz
In C# ermöglicht Kovarianz die Behandlung von Schnittstellenreferenzen als Referenzen auf höhere Typen in der Hierarchie. Beispielsweise kann der Schnittstelle IBibble<out T>
eine Instanzreferenz von IBibble<Descendant>
zugewiesen werden, sofern die Klasse Descendant
vom Typ T
erbt. Das bedeutet, dass alles, was auf IBibble<T>
ausgeführt werden kann, auch auf IBibble<Descendant>
ausgeführt werden kann.
Wechselrichter
In C# ermöglicht die Kontravarianz, dass Schnittstellenreferenzen als Referenzen auf niedrigere Typen in der Hierarchie behandelt werden. Beispielsweise kann der Schnittstelle IBibble<in T>
eine Instanzreferenz von IBibble<Base>
zugewiesen werden, sofern der Typ Base
vom Typ T
erbt. Dies bedeutet, dass jedes Objekt, das IBibble<Base>
zugeordnet werden kann, auch IBibble<Descendant>
zugeordnet werden kann.
Verwendungen und Anwendungen
Kovarianz ist nützlich, wenn Sie mit Sammlungen von Objekten arbeiten, die einen gemeinsamen Basistyp haben. Durch die Verwendung kovarianter Schnittstellen stellen wir sicher, dass am Basistyp ausgeführte Operationen auch für alle abgeleiteten Typen gelten.
Kontravarianz ist nützlich, wenn es um Fabriken oder Delegierte geht, die Parameter unterschiedlichen Typs akzeptieren. Durch die Verwendung einer kontravarianten Schnittstelle stellen wir sicher, dass jedes Objekt, das einem Basistyp zugeordnet werden kann, auch als Parameter einer Factory oder eines Delegaten verwendet werden kann.
Beispiel
Bedenken Sie den folgenden Codeausschnitt:
<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>
In diesem Beispiel ist die Schnittstelle IBibbleOut<out T>
kovariant, sodass b
auf Descendant
-Objekte verweisen kann. Die Schnittstelle IBibbleIn<in T>
ist kontravariant, sodass d
auf Base
-Objekte verweisen kann.
Das obige ist der detaillierte Inhalt vonWie verbessern Kovarianz und Kontravarianz die Schnittstellennutzung in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!