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>
에도 할당할 수 있음을 의미합니다.
용도 및 응용
공분산은 공통 기본 유형을 공유하는 객체 컬렉션으로 작업할 때 유용합니다. 공변 인터페이스를 사용하여 기본 유형에서 수행된 작업이 모든 파생 유형에도 적용되도록 보장합니다.
반공변성은 다양한 유형의 매개변수를 허용하는 팩토리나 대리자를 처리할 때 유용합니다. 반공변 인터페이스를 사용하여 기본 유형에 할당할 수 있는 모든 개체를 팩토리 또는 대리자의 매개 변수로도 사용할 수 있도록 보장합니다.
예
다음 코드 조각을 고려하세요.
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; } } }
이 예에서 인터페이스 IBibbleOut<out T>
는 공변적이므로 b
가 Descendant
개체를 참조할 수 있습니다. 인터페이스 IBibbleIn<in T>
는 반공변적이므로 d
가 Base
개체를 참조할 수 있습니다.
위 내용은 공변성과 반공변성은 C#에서 인터페이스 사용을 어떻게 향상합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!