2016-11-09 9 views
-2

:Contravariance - 아래 작은 코드 예제 - 나는 공분산 및 contravariance에 대해 최근에 읽은 C#

public class BaseClass{ 
    public int x = 1; 

    public static void print(BaseClass objClass) 
    { 
     Console.WriteLine(objClass.GetType().Name + " " + objClass.x); 
    } 
} 

public class DerivedClass : BaseClass{ 
    public int x = 2; 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     BaseClass bC = new BaseClass(); 
     DerivedClass dC = new DerivedClass(); 

     BaseClass.print(bC); //DerivedClass 1 
     DerivedClass.print(bC); //DerivedClass 1 
     BaseClass.print(dC); //DerivedClass 1 
     DerivedClass.print(dC); //DerivedClass 1 
    } 
} 

내 질문은 - 무슨 실제로 우리에게 contravariance? BaseClass 메서드 (매개 변수는 BaseClass 타입 임)에 인수로 DerivedClass의 개체를 전달할 수 있지만 이러한 작업의 이점은 무엇입니까? 그리고 왜 DerivedClass 객체를 전달할 때 BaseClass에 x 값을 반환합니까?

아마도 이것은 반공 변이의 설명 혜택에 대한 나쁜 예일 수 있습니다. 그러면 다른 예를 들어 주시면 고맙겠습니다.

+6

이것은 어디에서나 반공을 사용하지 않습니다. – Lee

+0

와우 - 그래서 인터넷에서 오해의 소지가있는 튜토리얼이 있습니다.)하지만 어쨌든 - 왜 누군가가 DerivedClass 객체를 전달하면 나에게 BaseClass의 x 값을 반환하는지 설명 할 수 있습니까? 변화가 없다면 왜 그렇게 할 수 있습니까? PS. Sinatr - 그 링크 덕분에 – Hadrian

+1

상속/다형성과의 혼란을 혼란스럽게합니다. –

답변

1

왜 DerivedClass 객체를 전달하면 BaseClass에서 x 값을 반환합니까?

은 (는) 필드를 파생 클래스에 숨 깁니다. 실제로 DerivedClass두 개의x 필드를가집니다. 하나는 기본 클래스에서 하나, 파생 클래스에서 하나입니다. print의 매개 변수는 BaseClass이므로 컴파일러는 objClass.x을 기본 클래스의 필드에 바인딩합니다.

가상 재산과 재정이 아닌 경우

public class BaseClass{ 
    public virtual int x {get {return 1;}} 

    public static void print(BaseClass objClass) 
    { 
     Console.WriteLine(objClass.GetType().Name + " " + objClass.x); 
    } 
} 

public class DerivedClass : BaseClass{ 
    public override int x {get {return 2;}} 
} 

하거나 파생 클래스에서 다른 값으로 기본 필드 설정을 :

public class DerivedClass : BaseClass{ 
    public DerivedClass() {x = 2;} 
} 

당신은 볼 것 당신이 기대하는 결과.

+0

도움이되는 설명에 감사드립니다. 이제 나에게 꽤 분명해! – Hadrian