클래스 상속과 관련하여 공분산 대 비공개
-
07-07-2019 - |
문제
개념 '공분산'과 '불안정한'의 의미는 무엇입니까?
2 개의 수업이 주어지고 동물 그리고 코끼리 (상속 동물), 내 이해는 코끼리를 동물에 넣으려고 노력하면 런타임 오류를 얻을 수 있다는 것입니다. 코끼리는 동물보다 "더 큰"(더 구체적)이기 때문에 발생합니다. 그러나 동물을 코끼리 배열에 넣고 코끼리가 어떻게 동물 특성을 포함하는지 보는 것을 보게 될 수 있습니까?
해결책
당신은 그것을 거꾸로 가지고 있습니다. 동물 어레이에 코끼리를 추가 할 수 있습니다. 이다 동물, 그리고 동물이 필요한 모든 방법을 보장합니다. 코끼리 어레이에 동물을 추가 할 수 없습니다. ~ 아니다 코끼리가 필요한 모든 방법을 가지고 있습니다.
위키 백과 기사 공분산 및 비정형 이것에 대한 좋은 설명이 있습니다.
프로그래밍 언어의 유형 시스템 내에서, 유형에서 유형으로의 연산자는 유형의 순서 (≤)을 보존하는 경우 더 구체적인 것의 유형을 더 일반적인 것에서보다 일반적인 것까지 주문하는 경우 공분산입니다. 이 순서를 되돌리면 비밀리에 있습니다. 이들 중 어느 것도 적용되지 않으면 운영자는 변하지 않습니다. 이 용어는 카테고리 이론에서 나옵니다.
또한, 당신은 Elephant 형이 "더 큰"것이라고 말했습니다. 이것은 그렇지 않습니다. 유형 동물은 코끼리, 기린 및 사자와 같은보다 구체적인 유형을 포함한다는 의미에서 "더 큰"것입니다.
다른 팁
C# 4.0의 공분산 및 비열한에 대한이 개요를 살펴보고 도움이되는지 확인하십시오.
45-49 페이지를 읽으십시오 Visual Studio 2010을 사용하여 .NET 4.0을 소개합니다 이 정확한 예를 다루는 것입니다. 코끼리의 멋진 사진도 있습니다.
꺼내야 할 요점은
var things = new List<IThing<IContent>> { new ConcreteThing() }
와 함께:
public class ConcreteThing : IThing<ConcreteContent>
{
}
인터페이스 정의에 "out"이 필요하므로보다 구체적인 양식을 설정할 수 있지만 ITHING에서 읽은 내용은보다 일반적인 유형이어야합니다.
public interface IThing<out T> where T : IContent
{
}
public interface IGoOut<out T>
{
T Func();
}
public interface IComeIn<in T>
{
void Action(T obj);
}
public class GoOutClass<T>:IGoOut<T>
{
public T Func()
{
return default(T);
}
}
public class ComeInClass<T> : IComeIn<T>
{
public void Action(T obj) { }
}
==========================================================
object obj = null;
//Covariance Example [Array + IEnumerable<T> + IEnumerator<T> + IInterface<Out T> + Func<T>]
object[] array = (string[]) obj;
IEnumerable<object> enumerable = (IEnumerable<string>) obj;
IEnumerator<object> enumerator = (IEnumerator<string>)obj;
IGoOut<object> goOut = (GoOutClass<string>)obj;
Func<object> func = (Func<string>)obj;
//Contravariance Example[IInterface<in T>]
IComeIn<string> comeIn = (ComeInClass<object>) obj;