C#編程語言與面向對象—— 多態


多態編程的基本原理是:
使用基類或接口變量編程。

在多態編程中,基類一般都是抽象類,其中擁有一個或多個抽象方法,各個子類可以根據需要重寫這些方法。或者使用接口,每個接口都規定了一個或多個抽象方法,實現接口的類根據需要實現這些方法。

因此,多態的實現分為兩大基本類別:繼承多態和接口多態。

繼承多態

設想動物園飼養員每天需要給他所負責死樣的獅子、猴子和鴿子喂食。

首先,建立三個類分別代表三個動物

飼養員用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的子類。具有這種特性的數組成為"多態數組"。

編程中應用多態,可以將其簡化為一下兩句:

應用繼承實現對象的統一管理。

應用接口定義對象的行為特征。

使用多態的好處:

當要修改程序並擴充系統時,需要修改的地方較少,對其他部分代碼的影響較小。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM