2010-04-23 50 views
0

我已經開始掌握反轉現象了,儘管我試圖弄清楚什麼時候可以使用接口的好處。顯然我錯過了一些東西。無法用接口實現逆變?

這裏是C#4例如

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")); 

同樣的例子在早期版本的適用於C#

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")); 

這些未必是最好的例子,但我仍然不能似乎'得到它'。 keywork上定義的動作委託只需簡短的語法方式就像lambda是委託的?

回答

2

逆變是原因爲什麼這與接口一起工作。方法調用允許參數類型的變換(和返回類型協方差)。

可以有多種方法解決同一問題。

考慮到有時你無法控制類結構。如果你不能改變Dog的定義怎麼辦?沒有類型差異,你的任務突然變得更加困難。

協方差和逆變不是問題解決,他們的語言功能,如泛型類型。所有你可以用泛型類型做的事情,在泛型類型存在之前,你可以在.NET 1.x中做,並且仍然可以用很多裝箱和投射。你應該?這完全取決於你的要求。

+1

+1,更不用說有些事情(如Delegates和Enums)不能實現接口。 – Josh 2010-04-23 02:18:43