2017-12-07 9 views
0

많은 contravariance에 대해 배우기 위해 많은 블로그를 검토하고 있지만 더 많은 것을 배울수록 더 혼란스러워집니다. 나는 위의 라인이인터페이스에서 contravariance를 구현하는 #

ICovariant<derivedClass> derivedClass = new sample<baseClass>(); 

같은 contravariance을 구현

interface ICovariant<in T> 
    { 
     void add(T _object); 
    } 
    public class sample<T> : ICovariant<T> 
    { 
     List<T> lists = new List<T>(); 
     public void add(T _object) 
     { 
      lists.Add(_object); 
     } 
    } 
    public class baseClass 
    { 
     public string name { get; set; } 
     public void print() 
     { 
      Console.WriteLine("one method"); 
     } 
    } 
    public class derivedClass : baseClass 
    { 
     public string address { get; set; } 
     public void print() 
     { 
      Console.WriteLine("one more method"); 
     } 
    } 

을 다음과 같은

내 질문에, 난 인터페이스 및 구현이 있다고 가정하고, 내가 가장 파생를 정의 할 수 있어요 클래스에서 가장 파생 된 클래스에 있지만 내가이 일을 할 때 오류가 발생했습니다

derivedClass.add(new baseClass()); 

오류가 발생하는 이유는 무엇입니까?

  1. 나는 인터페이스에서 정의 할 때 반항 문자로 언급했습니다.
  2. 최소 상속 된 형식으로 샘플 클래스를 초기화 할 수있는 경우 add 메서드를 호출하는 동안 동일한 작업을 수행 할 수없는 이유는 무엇입니까? 내가 왜 add 메소드를 호출하는 동안 동일한 작업을 수행 할 수없는 나는 그 이상 상속 유형 샘플 클래스를 초기화 할 수 있어요 때

내가 뭔가

+0

'ICovariant'는 공변이지 않습니다. 공변 (covariant)'ICovariant'가 아닌 인터페이스의 이름을 지정하는 것은 꽤 의미가 있습니다. – Servy

답변

0

놓친 거지?

개체를 ICovariant<derivedClass>으로 캐스팅했기 때문에. ICovariant<derivedClass>에는 derivedClass 인스턴스 만 허용하는 add 메서드가 있으며 baseClassderivedClass 인스턴스가 아닙니다. 당신이 ICovariant<derivedClass>sample<baseClass> 캐스팅, 대신 sample<baseClass> (또는 ICovariant<baseClass>)로 남아 있지 않은 경우 다음 add 방법은 아닌 derivedClassbaseClass을 받아들이 당신은 그것을 어떤 baseClass 인스턴스를 전달할 수 있습니다.

+0

나는이 초기화를하는 동안 반동으로 인터페이스를 언급했다. ICovariant 그런 다음 이상적으로 두 클래스를 모두 사용할 수 있어야한다? –

+0

@ LijinDurairaj 예, 인터페이스는 반공입니다. 반올림 (contravariant)이기 때문에'ICVariant '변수에'sample '을 할당 할 수 있습니다. 그러나 그 반 차별성을 이용하도록 선택하면 인터페이스를 통해 해당 인스턴스로 할 수있는 일이 제한됩니다. 그것이 '샘플 '이'ICoveriant '가 * 할 수있는 모든 것을 할 수 있기 때문에 변환을 할 수있게 해주는 이유입니다. 기능적으로는 괜찮습니다. – Servy

+0

@LijinDurairaj 만약'baseClass' 나'derivedClass'를'add'에 건네주기를 원한다면'ICovariant '(또는 단지'샘플 ')이 아닌'ICovariant . 'ICovariant '는'baseClass'를 취할 수 없으며'derivedClass' 인스턴스 만 받아 들일 수 있습니다. – Servy