有兩個問題:1、既然接口方法已經(jīng)在類Cat中實現(xiàn)了,那么直接通過對象調(diào)用 c.catchmice();不就可以實現(xiàn)抓老鼠的功能了嗎?為什么還要把貓C強制轉(zhuǎn)換成接口類型?2、既然接口方法必須在類中實現(xiàn),哪和直接在類中定義方法有什么區(qū)別?例如,如果狗爬樹也調(diào)用ClimbTree接口的話,是不是還得在狗的類里面再寫一次爬樹接口的函數(shù)體嗎?
? ? public class Cat : Pet,ICatchMice,IClimbTree
? ? {
? ? ? ? public Cat(string name):base(name)? //構(gòu)造函數(shù)
? ? ? ? {
?
? ? ? ? }
? ? ? ? public override void Speak()? //override 重寫
? ? ? ? {
? ? ? ? ? ? Console.WriteLine(_name + " is speaking:" + "喵喵");
? ? ? ? }
? ? ? ?public void catchmice()? //實現(xiàn)接口成員,既要聲明且加上public 又要加上函數(shù)體
? ? ? ?{
? ? ? ? ? ? Console.WriteLine(_name + " had caught a mice!");
? ? ? ? }
? ? ? ? public void climbtree()
? ? ? ? {
? ? ? ? ? ?Console.WriteLine(_name + " is climbing a big tree!");
? ? ? ? }
? ? }
?class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? //用基類類型的引用,可以方便不同子類的統(tǒng)一管理 ,例如利用一個容器(數(shù)組)保存所有的子類
? ? ? ? ? ? Pet[] pets = new Pet[] { new Dog("喵喵"),new Cat("汪汪"),new Taidi("小三") };
? ? ? ? ? ? for (int i=0;i<pets.Length;++i)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? pets[i].Speak();
? ? ? ? ? ? }
? ? ? ? ? ? Cat c = new Cat("Tom");
? ? ? ? ? ? //ICatchMice catchM = (ICatchMice)c;
? ? ? ? ? ? //catchM.catchmice();
? ? ? ? ? ? c.catchmice();
? ? ? ? ? ? c.climbtree();
? ? ? ? ? ? Console.ReadLine();
? ? ? ? }
? ? }
2018-10-29
強制轉(zhuǎn)換屬于顯示接口,而一般用隱式接口
當(dāng)類實現(xiàn)多個接口時,并且接口中包含相同的方法簽名,可以標(biāo)識出哪個方法屬于哪個接口
2018-08-15
可以去看看Gof的書。。。
2018-07-11
就是為了降低耦合度,提高你代碼的擴展性,這就是為什么采用接口。
把貓C強制轉(zhuǎn)換成接口類型的優(yōu)點是讓你的代碼提高了擴展性啊,你可以是貓,狗,蜥蜴等等。如果你用Cat,那你只能是貓了。明白沒。。。
如果想讓狗爬樹,可以調(diào)用Climbtree接口,是需要重寫一次爬樹函數(shù)的。
2018-05-29
\\△石'必忍\九d△/次◇情事_,o∨二心入啟九o??丫條,\
2018-05-23
面向?qū)ο蟮幕驹瓌t:依賴倒轉(zhuǎn)原則,程序設(shè)計應(yīng)該依賴抽象,而不依賴具體