2010-04-23 5 views
0

인터페이스가 대신 사용될 수있는 이점을 알아 내려하고 있지만, 나는 contravariance를 파악하기 시작했습니다. 분명히 나는 ​​뭔가를 놓치고있다. 여기 인터페이스로 반공소를 구현할 수 없습니까?

는 C# 4 예를 들어 C#을에 이전 버전에서 작동

class Dog : Animal { 
     public Dog(string name) : base(name) { } 
    } 

    class Animal { 

     string _name; 

     public Animal(string name) { 
      _name = name; 
     } 

     public void Walk() { 
      Console.WriteLine(_name + " is walking"); 
     } 
    } 

Action<Animal> MakeItMove = (ani) => { ani.Walk(); }; 

      Action<Dog> MakeItWalk = MakeItMove; 

      MakeItWalk(new Dog("Sandy")); 

같은 예이다

class Dog : Animal { 
     public Dog(string name) : base(name) { } 
    } 

    class Animal : IAnimal { 

     string _name; 

     public Animal(string name) { 
      _name = name; 
     } 

     public void Walk() { 
      Console.WriteLine(_name + " is walking"); 
     } 
    } 

    interface IAnimal { 

     void Walk(); 
    } 

    Action<IAnimal> MakeItMove = (ani) => { ani.Walk(); }; 

       Action<IAnimal> MakeItWalk = MakeItMove; 

       MakeItWalk(new Dog("Sandy")); 

이 가장 좋은 예되지 않을 수도 있습니다,하지만 난 여전히 수없는 것 '해'. 은 작업 위임에 정의 된 핵심 작업입니다. 간단히 말해서 람다는 위임자와 같은 구문 방식입니까?

답변

2

이유가 있습니다. 이 이유는이 인터페이스와 함께 작동합니다. 메소드 호출은 인자 타입의 반항성 (return type covariance)을 허용한다.

동일한 문제를 해결할 수있는 방법은 여러 가지가 있습니다.

때때로 클래스 구조를 제어 할 수 없다고 생각하십시오. Dog의 정의를 변경할 수 없다면 어떻게 될까요? 귀하의 작업이 갑자기 형식 차이가 없으면 훨씬 어려워졌습니다.

공분산 및 contravariance은 일반적인 유형과 같은 언어 기능이다, 해결 될 문제 수 없습니다. 제네릭 형식으로 할 수있는 모든 것을, 제네릭 형식이 존재하기 전에 .NET 1.x에서 수행 할 수 있으며 여전히 많은 복싱 및 캐스팅을 수행 할 수 있습니다. 너? 이는 전적으로 귀하의 요구 사항에 달려 있습니다.

+1

+1, Delegates 및 Enum과 같은 일부 기능은 인터페이스를 구현할 수 없습니다. – Josh

관련 문제