多態編程的基本原理是:
使用基類或接口變量編程。
在多態編程中,基類一般都是抽象類,其中擁有一個或多個抽象方法,各個子類可以根據需要重寫這些方法。或者使用接口,每個接口都規定了一個或多個抽象方法,實現接口的類根據需要實現這些方法。
因此,多態的實現分為兩大基本類別:繼承多態和接口多態。
繼承多態
設想動物園飼養員每天需要給他所負責死樣的獅子、猴子和鴿子喂食。
首先,建立三個類分別代表三個動物

飼養員用Feeder類表示。由於三種動物吃的動物一樣,Feeder類必須擁有三個喂動物的公共方法:

過程如下:
static void Main(string[] args) { Monkey m=new Monkey(); Pigeon p=new Pigeon(); Lion l=new Lion(); Feeder f=new Feeder(); f.Name="小李"; f.FeedMonkey(); //喂猴子 f.FeedPigeon(); //喂鴿子 f.FeedLion(); //喂獅子 }
如果領導有又把熊貓交給他管理,這是我們的程序不得不給Feeder類在增加一個方法:FeedPanda();
萬一小李后來又不管猴子了,又要從Feeder類中刪除FeedPigeon()方法。
所以這種編程方式很明顯不合理的。
我們可以應用多態的方法解決。
首先因為它們都是動物,因此,可以建立一個Animal抽象基類。

由於不同的動物吃不同的食物,所以在Animal類中定義一個抽象方法:eat();有子類負責實現。
abstract class Animal { public abstract void eat(); } //獅子 class Lion:Animal { public override void eat() { Console.WriteLine("吃肉"); } } //猴子 class Money:Animal { public override void eat() { Console.WriteLine("吃香蕉"); } } //鴿子 class Pigeon:Animal { public override void eat() { Console.WriteLine("吃大米"); } }
現在,可以將Feeder類的三個喂養方法合並為一個FeedAnimal:

Feeder類代碼:
//飼養員 class Feeder { public String Name; public void FeedAnimal(Animal animals) { animals.eat(); } }
喂養過程:
static void Main(string[] args) { Monkey m=new Monkey(); Pigeon p =new Pigeon(); Lion l=new Lion(); Feeder f=new Feeder(); f.Name="小李"; f.FeedAnimal(m);//喂猴子 f.FeedAnimal(p);//喂鴿子 f.FeedAnimal(l);//喂獅子 }
我們修改一下Feeder類的定義,增加一個新方法FeedAnimals(),新方法遠程的功能是喂養一群動物,接受的是Animal的數組:
class Feeder { //喂養一群動物 public voidFeedAnimals(Animal[] ans) { foreach(Animal an in ans) { an.eat(); } } }
過程如下:
static void Main(string args) { //動物數組 Animal[] ans={new Monkey(),new Pigeon(), new Lion()}; Feeder f=new Feeder(); f.Name="小李"; f.FeedAnimals(ans); }
代碼中數組ans的元素為Animal,因此,可以在其中存入任何一個Animal的子類。具有這種特性的數組成為"多態數組"。
編程中應用多態,可以將其簡化為一下兩句:
應用繼承實現對象的統一管理。
應用接口定義對象的行為特征。
使用多態的好處:
當要修改程序並擴充系統時,需要修改的地方較少,對其他部分代碼的影響較小。
