如果要簡要的描述多態的話,我個人是這樣理解的:通過繼承,父類定義方法,具休的實現由子類進行。
//父類 class Person { public virtual void skill() //vitrual -虛方法,方法可被重寫 { Console.WriteLine("人會走路"); } } class Xiaoming:Person { public override void skill() //重寫父類方法 { Console.WriteLine("小明會唱歌"); } } class XiaoHu : Person { public override void skill() { Console.WriteLine("小虎會游泳"); } } class Program { static void Main(string[] args) { Person p1 = new Xiaoming();//裡氏轉換原則 可以將子類賦值給父類 Person p2 = new XiaoHu(); p1.skill(); p2.skill(); Console.ReadKey(); } }
輸出:
通過這個例子 Person 類定義了skill方法,方法的具體實現由子類進行。
即 如果子類的 override 改為new 那麼父類和子類的方法是獨立的,此時執行下面的代碼
//父類 class Person { public virtual void skill() { Console.WriteLine("人會走路"); } } class Xiaoming:Person { public new void skill() //重寫父類方法 { Console.WriteLine("小明會唱歌"); } } class Program { static void Main(string[] args) { Person p1 = new Xiaoming();//裡氏轉原則 Xiaoming p2 = new Xiaoming(); p1.skill(); p2.skill(); Console.ReadKey(); } }
輸出:
可以看出,p.skill();這裡看.前面的對象,是什麼類型的,就執行那個類裡裡面的 skill()方法,這裡P1是Person類的,P2是Xiaoming類的。
如果我想通過輸入 小明,小虎。 這時候系統自動給顯示小明會什麼,小虎會什麼出來。
生活中工廠是用來加工的產品的,同樣這裡也是根據傳入的參數,加工後返回對應的結果
全部代碼
//父類 class Person { public virtual void skill() { Console.WriteLine("人會走路"); } } class Xiaoming:Person //繼承Person { public override void skill() //重寫父類方法 { Console.WriteLine("小明會唱歌"); } } class XiaoHu : Person { public override void skill() { Console.WriteLine("小虎會游泳"); } } //工廠類 --新增 class Factory { public static Person instance(string Name) { switch (Name) { case "1": return new Xiaoming(); case "2":return new XiaoHu(); default: return null; } } } class Program { static void Main(string[] args) { Console.WriteLine("請輸入序號查看技能,輸入1、2...."); Console.WriteLine("1.小明"); Console.WriteLine("2.小虎"); Console.WriteLine("輸入:"); string res = Console.ReadLine(); Console.WriteLine("結果:"); Person p = Factory.instance(res); if (p != null) { p.skill(); } else { Console.WriteLine("沒找到這個人"); } Console.ReadKey(); } }
執行結果:
此時,多態+簡單工廠就已經實現了。
1. 前面的 virtual(虛方) 實現多態已經完成了,其實 抽象(abstract)實現多態也是大同小異
2. abstract 和virtual的區別在於abstract 沒有方法體,方法都可以被重寫。
實現:把上面完整的代碼 的父類改成 下面就完成了,功能一樣。
//父類 abstract class Person { public abstract void skill();//方法沒有方法體 }
1.這裡就不是繼承了,是實現接口的方法。
2.接口的方法和抽象一樣沒有方法體。
實現:把上面完整的代碼的父類改成接口
//接口 interface Person { void skill(); }
然後把原來子類的 override 去掉 ,因為接口(interface)是不能被重寫(override)的。虛方法(virtual),抽象(abstract)才能被重寫
OK,接口實現多態也是完成了。