關于接口的問題
如果我不在調用方法里面加ICatchMice ic = (ICatchMice)c;這一字段也可以調用接口的抓老鼠和爬樹方法,而加了這一段代碼之后這個ic只能調用抓老鼠這個接口的方法,這不是限制了ic的調用方法的范圍嗎?但是又與c無關,我想問下各位大神這樣做有什么意義呢?謝謝!
如果我不在調用方法里面加ICatchMice ic = (ICatchMice)c;這一字段也可以調用接口的抓老鼠和爬樹方法,而加了這一段代碼之后這個ic只能調用抓老鼠這個接口的方法,這不是限制了ic的調用方法的范圍嗎?但是又與c無關,我想問下各位大神這樣做有什么意義呢?謝謝!
舉報
2018-08-21
用接口還是用類調用要看具體的使用場景的。
假如有10只不同的寵物,攻城獅A負責收集這10只寵物的叫聲,攻城獅B負責聽這些寵物的聲音來給寵物分類。那么你難道要傳10個不同的寵物類給B嗎,這樣B會打死你的。這個時候,你就要建一個叫的接口集合,把10只寵物都封裝進這個接口集合,把這個接口集合傳給B,B只要循環遍歷接口集合,分別調用這個接口的叫的方法,就能讓不同寵物叫出聲。。。
你可以根據我寫的小代碼然后和我上面的解釋,小小腦補一下。。。
//攻城獅A負責把不同的寵物裝進箱子
? ? ? ? public static List<ICall> GcsA()
? ? ? ? {
? ? ? ? ? ? Pig p = new Pig();
? ? ? ? ? ? Dog d = new Dog();
? ? ? ? ? ? List<ICall> listi = new List<ICall>();
? ? ? ? ? ? listi.Add((ICall)p);
? ? ? ? ? ? listi.Add((ICall)d);
? ? ? ? ? ? return listi;
? ? ? ? }
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? //攻城獅B拿到了10只寵物的箱子,循環讓它門叫
? ? ? ? ? ? List<ICall> listi = GcsA();
? ? ? ? ? ? for (int i = 0; i < listi.Count; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine(listi[i].Call());
? ? ? ? ? ? }
? ? ? ? }
最后說一句,接口一般用于規范,這個規范不僅僅只是對創建者的規范,也是對使用者的規范。B只要寵物的叫聲,那么你還有必要告訴B這些寵物叫什么名字嗎?
2018-08-21
不加ICatchMice ic = (ICatchMice)c;
ic.CatchMice();就沒有辦法使用,這里老師這么寫的目的應該是為了剛好的向學生展示這種調用方法的限制范圍