공분산과 반공분산: 실제 적용
실제 시나리오에서 공분산과 반공분산을 구현하면 코드의 유연성과 재사용성을 높일 수 있습니다. 다음은 간단한 예입니다.
공변:
공변 인터페이스는 파생 유형을 덜 파생된 유형에 할당할 수 있는 출력 매개변수를 정의합니다. 예:
<code class="language-c#">public interface ICovariant<out T> { } public class Covariant<T> : ICovariant<T> { } public class Fruit { } public class Apple : Fruit { }</code>
여기서 ICovariant<Fruit>
은 ICovariant<Apple>
에 할당될 수 있는데, 이는 Apple이 Fruit의 하위 유형이기 때문입니다. 공분산을 사용하면 형변환 없이 다양한 유형의 데이터를 저장할 수 있으므로 코드가 더욱 간결해지고 다양해집니다.
I반공변:
반공변 인터페이스는 입력 매개변수를 정의하여 더 적은 파생 유형을 더 많은 파생 유형에 할당할 수 있도록 합니다. 예:
<code class="language-c#">public interface IContravariant<in T> { } public class Contravariant<T> : IContravariant<T> { }</code>
IContravariant<Apple>
은 Fruit이 Apple의 슈퍼타입이기 때문에 IContravariant<Fruit>
에 할당될 수 있습니다. 반공변성(Contravariance)을 사용하면 일관된 동작을 보장하면서 다양한 유형의 입력 매개변수를 허용할 수 있습니다.
예:
다음 코드는 공분산과 반공분산의 사용을 보여줍니다.
<code class="language-c#">public class TheInsAndOuts { public void Covariance() { ICovariant<Fruit> fruit = new Covariant<Fruit>(); ICovariant<Apple> apple = new Covariant<Apple>(); Covariance(fruit); Covariance(apple); // 通过协变允许从 Apple 向 Fruit 上转型 } public void Contravariance() { IContravariant<Fruit> fruit = new Contravariant<Fruit>(); IContravariant<Apple> apple = new Contravariant<Apple>(); Contravariant(fruit); // 通过逆变允许从 Fruit 向 Apple 下转型 Contravariant(apple); } public void Covariant(ICovariant<Fruit> fruit) { } public void Contravariant(IContravariant<Apple> apple) { } }</code>
요약:
공분산과 반공분산을 통해 개발자는 호환 가능한 유형 할당을 허용하여 유연하고 재사용 가능한 코드를 만들 수 있습니다. 이는 상속 기능을 확장하고 데이터 처리 및 다양한 유형의 개체 간 매개변수 전달을 용이하게 합니다.
위 내용은 공분산(Covariance)과 반공분산(Contravariance)은 어떻게 코드 유연성과 재사용성을 향상시키는가?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!