淺析C#的多態性
時間:2018-09-29 來源:未知
什么是多態:同一個操作,作用于不同的對象時,會有不同的結果,即同一個方法根據需要,作用于不同的對象時,會有不同的實現。
C#的多態包括:接口多態,繼承多態。
其中繼承多態又包括通過虛擬方法實現的多態和通過抽象方法實現的多態性
例如:基類動物都有吃的方法,但是不同的動物吃的東西就會不一樣,例如狼吃肉,羊吃草,這樣“吃”的這個方法就要在派生類里面重新實現以下,運行時,通過指向基類的指針,來調用實現派生類中的方法。
1. 接口多態性
把動物“吃”的方法放到一個接口(IAnimal)里,然后讓具體的動物類(Wolf/Sheep)繼承這個接口,并根據自己的需要實現這個接口。
代碼實現:
class Program {
static void Main(string[] args) {
new Wolf().Eat();
new Sheep().Eat();
}
}
public class Wolf : IAnimal {
//多態實現
public void Eat() {
Console.WriteLine("狼吃肉!");
}
}
public class Sheep : IAnimal {
//多態實現
public void Eat() {
Console.WriteLine("羊吃草!");
}
}
//接口
public interface IAnimal {
void Eat();
}
接口的多態性就是當不同的類繼承了相同的接口以后,都要根據自己的需要重新實現繼承的接口,這樣同樣的方法簽名在不同的類中就會實現不同的操作。
2. 繼承的多態性
設想動物園飼養員每天需要給他所負責死樣的獅子、猴子和鴿子喂食。
首先,建立三個類分別代表三個動物

飼養員用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的子類。具有這種特性的數組成為"多態數組"。
多態的意義:
編程中應用多態,可以將其簡化為一下兩句:
應用繼承實現對象的統一管理。
應用接口定義對象的行為特征。
使用多態的好處:
當要修改程序并擴充系統時,需要修改的地方較少,對其他部分代碼的影響較小。

