C#의 공변 및 반공변 인터페이스
C#의 공변 및 반공변 인터페이스는 유형 및 해당 상속 계층을 처리할 때 더 큰 유연성을 제공합니다.
공변 인터페이스(T 출력)
공변 인터페이스는 일반 유형 매개변수가 상속 계층 구조에서 더 높은 수준의 유형으로 처리될 수 있도록 지정합니다. interface IBibble<out T>
으로 선언된 인터페이스의 경우 인터페이스 참조가 T에서 파생된 유형을 나타내는 것으로 생각할 수 있습니다.
인버터 인터페이스(T)
반공변 인터페이스를 사용하면 일반 유형 매개변수를 상속 계층 구조에서 하위 수준 유형으로 처리할 수 있습니다. 인터페이스를 interface IBibble<in T>
으로 정의하면 인터페이스 참조는 T의 기본 유형을 나타내는 유형으로 간주할 수 있습니다.
공분산의 실제 응용
공분산을 사용하면 파생 유형의 컬렉션을 기본 유형의 컬렉션인 것처럼 처리할 수 있습니다. 예를 들어 각각 이름이 있는 동물 목록을 생각해 보세요. 모든 동물에는 이름이 있으므로 안전하게 모든 동물의 이름을 검색할 수 있습니다.
인버터의 실제 응용
반공변성을 사용하면 기본 유형 컬렉션에 파생 유형을 추가할 수 있습니다. 예를 들어, 동물 컬렉션에 액세스할 수 있고 여기에 물고기를 추가해야 하는 경우 모든 물고기는 동물이기 때문에 그렇게 할 수 있습니다. 그러나 컬렉션에 물고기만 포함되어 있다는 보장이 없기 때문에 컬렉션에서 물고기를 가져오려는 시도는 허용되지 않습니다.
입력 및 출력 위치
C# 4.0에서 in
및 out
키워드는 인터페이스를 공변 또는 반공변으로 명시적으로 표시합니다. in
은 입력 위치(메서드 매개변수, 쓰기 전용 속성)를 지정하고, out
는 출력 위치(메서드 반환 값, 읽기 전용 속성, out
메서드 매개변수)를 나타냅니다.
예
다음 예에서는 공분산과 반공분산을 보여줍니다.
<code class="language-csharp">interface IBibbleOut<out T> { } interface IBibbleIn<in T> { } class Program { static void Main(string[] args) { var b = GetOutDescendant(); // b只能保存Descendant对象 var d = GetInBase(); // d可以接收Base和Descendant对象 } static IBibbleOut<Descendant> GetOutDescendant() { return null; } static IBibbleIn<Base> GetInBase() { return null; } } class Base { } class Descendant : Base { }</code>
공변성과 반공변성이 없으면 컴파일러는 예제 코드에서 유형 안전성을 보장할 수 없으며 이로 인해 오류가 발생할 수 있습니다.
위 내용은 공변성과 반공변성은 C# 인터페이스의 형식 안전성과 유연성을 어떻게 향상합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!