문제

나는 단어의 정확한 의미를 알아 내려고 노력하고있다 Covariance 그리고 Contravariance 온라인으로 여러 기사와 stackoverflow에 대한 질문과 내가 이해할 수있는 것에서는 다형성에 대한 또 다른 단어.

위의 진술에 맞습니까? 아니면 내가 틀렸어?

도움이 되었습니까?

해결책

그것은 확실히 다형성과 관련이 있습니다. 나는 그들이 다형성에 대한 "또 다른 단어"라고 말하지 않을 것입니다. 그러나 그들은 매우 구체적인 상황에 관한 것입니다. 특정 맥락에서.

예를 들어, 정상적인 다형성을 사용하면 Banana a Fruit - 그렇다고해서 당신이 대체 할 수 있다는 의미는 아닙니다 Fruit 모든 당신은 유형을 볼 때 Banana. 예를 들어, a List<Banana> a로 취급 할 수 없습니다 List<Fruit> 왜냐하면 list.Add(new Apple()) 유효합니다 List<Fruit> 그러나 그렇지 않습니다 List<Banana>.

공분산은 원래 유형이있는 API에서 "더 큰"(덜 구체적) 유형을 대체 할 수 있습니다. "출력"위치에 사용됩니다 (예 : 리턴 값으로). Unravariance는 원래 유형이있는 API에서 "더 작은"(보다 구체적인) 유형을 대체 할 수 있습니다. "입력"위치에 사용됩니다.

하나의 포스트로 모든 세부 사항을 다루기가 어렵습니다 (다른 사람이 이것보다 더 나은 일을 할 수 있기를 바랍니다!). Eric Lippert는 우수합니다 일련의 블로그 게시물 그것에 대해.

다른 팁

모든 외침에 감사드립니다.

Jon과 Rasmus의 답변은 괜찮습니다. 나는 빠른 기술 메모를 추가 할 것입니다.

우연히 그리고 비공식적으로 말할 때, 사람들은 "공분산"과 "불균형"을 사용하여 특정 종류의 다형성을 나타냅니다. 즉, 거미를 일련의 동물 인 것처럼 취급하는 다형성의 종류입니다.

우리는 모든 컴퓨터-과학을 얻고 더 기술적 인 정의를 만들려고 노력했을 것입니다. 그러면 공분산과 비결정이 "일종의 다형성"이라고 말하지 않을 것입니다. 나는 다음과 같은보다 기술적 인 정의에 접근 할 것입니다.

먼저, C#에는 두 가지 가능한 다형성이 있으며 혼동하지 않는 것이 중요합니다.

첫 번째 종류는 전통적으로 "임시 다형성"이라고 불리며, 그것은 당신이 메소드 m (동물 x)을 가진 다형성이며, 거미와 기린과 왈라비를 통과 시키며,이 방법은 통과 된 인수를 동일하게 취급합니다. 동물 기반 클래스가 보장하는 공통점을 사용하여.

두 번째 종류는 전통적으로 "파라 메트릭 다형성"또는 "일반 다형성"이라고합니다. 그것이 일반적인 방법을 만드는 능력입니다 M<T>(T t) 그리고 방법에 다시, T.의 제약 조건에 의해 보장 된 공통점을 기반으로 인수를 균일하게 취급하는 방법에 많은 코드가 있습니다.

나는 당신이 첫 번째 다형성에 대해 이야기하고 있다고 생각합니다. 그러나 내 요점은 우리가 다형성을 프로그래밍 언어의 능력으로 정의 할 수 있다는 것입니다. 알려진 공통성에 따라 다른 것을 균일하게 취급하십시오. (예를 들어, 알려진 기본 유형 또는 알려진 구현 된 인터페이스.)

공분산과 비밀화는 프로그래밍 언어의 능력입니다. 유형 인수의 알려진 공통점에서 추론 된 일반 유형 사이의 공통점을 활용하십시오.

당신은 공동 및 비정규생에 대해 고급 형태의 다형성으로 생각할 수 있습니다. 마치 아동 계급을 마치 부모 계급 인 것처럼, 공동 및 분비물을 사용하는 것처럼, 다형성은 다형성 계급과 관련된 수업으로 확장 될 수 있습니다.

두 가지 수업을 상상해보십시오.

public class Pet { /*...*/ }
public class Cat:Pet { /*...*/ }

다형성은 a Cat A로 Pet:

void Feed(Pet pet) { /* ... */ }

Cat cat = ...
Feed(cat);

공동 및 불안정은 ICollection<Cat> 로서 ICollection<Pet> (공분산) :

void FeedAll(ICollection<Pet> pets) { /* ... */ }

List<Cat> cats = ...
FeedAll(cats);

또는 사용하려면 Action<Pet> 로서 Action<Cat> (비밀) :

Action<Pet> GetFeeder() { /* ... */ }

Action<Cat> feeder = GetFeeder();

Eric Lippert는이 기능을 처음 디자인 할 때 훌륭한 블로그 시리즈를 썼습니다. 1 부입니다 여기.

나는 또 다른 단어가 아니라 특별한 종류의 다형성이라고 생각합니다. 그것은 다형성입니다 대표 반환 유형의 기지가있는 대의원이 자식 유형을 수락 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top