有兩個問題:1、既然接口方法已經在類Cat中實現了,那么直接通過對象調用 c.catchmice();不就可以實現抓老鼠的功能了嗎?為什么還要把貓C強制轉換成接口類型?2、既然接口方法必須在類中實現,哪和直接在類中定義方法有什么區別?例如,如果狗爬樹也調用ClimbTree接口的話,是不是還得在狗的類里面再寫一次爬樹接口的函數體嗎?
? ? public class Cat : Pet,ICatchMice,IClimbTree
? ? {
? ? ? ? public Cat(string name):base(name)? //構造函數
? ? ? ? {
?
? ? ? ? }
? ? ? ? public override void Speak()? //override 重寫
? ? ? ? {
? ? ? ? ? ? Console.WriteLine(_name + " is speaking:" + "喵喵");
? ? ? ? }
? ? ? ?public void catchmice()? //實現接口成員,既要聲明且加上public 又要加上函數體
? ? ? ?{
? ? ? ? ? ? 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)
? ? ? ? {
? ? ? ? ? ? //用基類類型的引用,可以方便不同子類的統一管理 ,例如利用一個容器(數組)保存所有的子類
? ? ? ? ? ? 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
強制轉換屬于顯示接口,而一般用隱式接口
當類實現多個接口時,并且接口中包含相同的方法簽名,可以標識出哪個方法屬于哪個接口
2018-08-15
可以去看看Gof的書。。。
2018-07-11
就是為了降低耦合度,提高你代碼的擴展性,這就是為什么采用接口。
把貓C強制轉換成接口類型的優點是讓你的代碼提高了擴展性啊,你可以是貓,狗,蜥蜴等等。如果你用Cat,那你只能是貓了。明白沒。。。
如果想讓狗爬樹,可以調用Climbtree接口,是需要重寫一次爬樹函數的。
2018-05-29
\\△石'必忍\九d△/次◇情事_,o∨二心入啟九o??丫條,\
2018-05-23
面向對象的基本原則:依賴倒轉原則,程序設計應該依賴抽象,而不依賴具體