狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#多態(tài)概述:通過繼承實現(xiàn)的不同對象調(diào)用相同的方法,表現(xiàn)出不同的行為

admin
2024年3月19日 11:30 本文熱度 708

封裝、繼承、多態(tài),面向?qū)ο蟮娜筇匦裕皟身椑斫庀鄬θ菀祝斫舛鄳B(tài),特別是深入的了解,對于初學(xué)者而言可能就會有一定困難了。我一直認(rèn)為學(xué)習(xí)OO的最好方法就是結(jié)合實踐,封裝、繼承在實際工作中的應(yīng)用隨處可見,但多態(tài)呢?也許未必,可能不經(jīng)意間用到也不會把它跟“多態(tài)”這個詞對應(yīng)起來。在此拋磚引玉,大家討論,個人能力有限,不足之處還請指正。

之前看到過類似的問題:如果面試時主考官要求你用一句話來描述多態(tài),盡可能的精煉,你會怎么回答?當(dāng)然答案有很多,每個人的理解和表達(dá)不盡相同,但我比較趨向這樣描述:通過繼承實現(xiàn)的不同對象調(diào)用相同的方法,表現(xiàn)出不同的行為,稱之為多態(tài)。

例1:

代碼

public class Animal

    {

        public virtual void Eat()

        {

            Console.WriteLine("Animal eat");

        }

    }

    public class Cat : Animal

    {

        public override void Eat()

        {

            Console.WriteLine("Cat eat");

        }

    }

    public class Dog : Animal

    {

        public override void Eat()

        {

            Console.WriteLine("Dog eat");

        }

    }

    class Tester

    {

        static void Main(string[] args)

        {

            Animal[] animals = new Animal[3];

            animals[0] = new Animal();

            animals[1] = new Cat();

            animals[2] = new Dog();

            for (int i = 0; i < 3; i++)

            {

                animals[i].Eat();

            }

        }

    }

 輸出如下:
Animal eat...

Cat eat...

Dog eat...

在上面的例子中,通過繼承,使得Animal對象數(shù)組中的不同的對象,在調(diào)用Eat()方法時,表現(xiàn)出了不同的行為。

多態(tài)的實現(xiàn)看起來很簡單,要完全理解及靈活的運(yùn)用c#的多態(tài)機(jī)制,也不是一件容易的事,有很多需要注意的地方。

new的用法

先看下面的例子。

例2:

代碼

public class Animal

    {

        public virtual void Eat()

        {

            Console.WriteLine("Animal eat");

        }

    }

    public class Cat : Animal

    {

        public new void Eat()

        {

            Console.WriteLine("Cat eat");

        }

    }

    class Tester

    {

        static void Main(string[] args)

        {

            Animal a = new Animal();

            a.Eat();

            Animal ac = new Cat();

            ac.Eat();

            Cat c = new Cat();

            c.Eat();

        }

    }

運(yùn)行結(jié)果為:

Animal eat...

Animal eat...

Cat eat...

可以看出,當(dāng)派生類Cat的Eat()方法使用new修飾時,Cat的對象轉(zhuǎn)換為Animal對象后,調(diào)用的是Animal類中的Eat()方法。其實可以理解為,使用new關(guān)鍵字后,使得Cat中的Eat()方法和Animal中的Eat()方法成為毫不相關(guān)的兩個方法,只是它們的名字碰巧相同而已。所以, Animal類中的Eat()方法不管用還是不用virtual修飾,也不管訪問權(quán)限如何,或者是沒有,都不會對Cat的Eat()方法產(chǎn)生什么影響(只是因為使用了new關(guān)鍵字,如果Cat類沒用從Animal類繼承Eat()方法,編譯器會輸出警告)。

我想這是設(shè)計者有意這么設(shè)計的,因為有時候我們就是要達(dá)到這種效果。嚴(yán)格的說,不能說通過使用new來實現(xiàn)多態(tài),只能說在某些特定的時候碰巧實現(xiàn)了多態(tài)的效果。

override實現(xiàn)多態(tài)

真正的多態(tài)使用override來實現(xiàn)的。回過去看前面的例1,在基類Animal中將方法Eat()用virtual標(biāo)記為虛擬方法,再在派生類Cat和Dog中用override對Eat()修飾,進(jìn)行重寫,很簡單就實現(xiàn)了多態(tài)。需要注意的是,要對一個類中一個方法用override修飾,該類必須從父類中繼承了一個對應(yīng)的用virtual修飾的虛擬方法,否則編譯器將報錯。

好像講得差不多了,還有一個問題,不知道你想沒有。就是多層繼承中又是怎樣實現(xiàn)多態(tài)的。比如類A是基類,有一個虛擬方法method()(virtual修飾),類B繼承自類A,并對method()進(jìn)行重寫(override修飾),現(xiàn)在類C又繼承自類B,是不是可以繼續(xù)對method()進(jìn)行重寫,并實現(xiàn)多態(tài)呢?看下面的例子。


例3:
代碼

public class Animal

   {

       public virtual void Eat()

       {

           Console.WriteLine("Animal eat");

       }

   }

   public class Dog : Animal

   {

       public override void Eat()

       {

           Console.WriteLine("Dog eat");

       }

   }

   public class WolfDog : Dog

   {

       public override void Eat()

       {

           Console.WriteLine("WolfDog eat");

       }

   }

   class Tester

   {

       static void Main(string[] args)

       {

           Animal[] animals = new Animal[3];

           animals[0] = new Animal();

           animals[1] = new Dog();

           animals[2] = new WolfDog();

           for (int i = 0; i < 3; i++)

           {

               animals[i].Eat();

           }

       }

}
 運(yùn)行結(jié)果為:
Animal eat...

Dog eat...

WolfDog eat... 

在上面的例子中類Dog繼承自類Animal,對方法Eat()進(jìn)行了重寫,類WolfDog又繼承自Dog,再一次對Eat()方法進(jìn)行了重寫,并很好地實現(xiàn)了多態(tài)。不管繼承了多少層,都可以在子類中對父類中已經(jīng)重寫的方法繼續(xù)進(jìn)行重寫,即如果父類方法用override修飾,如果子類繼承了該方法,也可以用override修飾,多層繼承中的多態(tài)就是這樣實現(xiàn)的。要想終止這種重寫,只需重寫方法時用sealed關(guān)鍵字進(jìn)行修飾即可。

abstract-override實現(xiàn)多態(tài)

先在我們在來討論一下用abstract修飾的抽象方法。抽象方法只是對方法進(jìn)行了定義,而沒有實現(xiàn),如果一個類包含了抽象方法,那么該類也必須用abstract聲明為抽象類,一個抽象類是不能被實例化的。對于類中的抽象方法,可以再其派生類中用override進(jìn)行重寫,如果不重寫,其派生類也要被聲明為抽象類。看下面的例子。

例4:


代碼

    public abstract class Animal

    {

      public abstract void Eat();

    }

    public class Cat : Animal

    {

        public override void Eat()

        {

            Console.WriteLine("Cat eat");

        }

    }

    public class Dog : Animal

    {

        public override void Eat()

        {

            Console.WriteLine("Dog eat");

        }

    }

    public class WolfDog : Dog

    {

        public override void Eat()

        {

            Console.WriteLine("Wolfdog eat");

        }

    }

    class Tester

    {

        static void Main(string[] args)

        {

            Animal[] animals = new Animal[3];

            animals[0] = new Cat();

            animals[1] = new Dog();

            animals[2] = new WolfDog();

            for (int i = 0; i < animals.Length; i++)

            {

                animals[i].Eat();

            }

        }

    }

運(yùn)行結(jié)果為:

Cat eat...

Dog eat...

Wolfdog eat...

從上面可以看出,通過使用abstract-override可以和virtual-override一樣地實現(xiàn)多態(tài),包括多層繼承也是一樣的。不同之處在于,包含虛擬方法的類可以被實例化,而包含抽象方法的類不能被實例化。

以上就是我對c#中多態(tài)的一些淺薄的認(rèn)識,如有錯誤的地方,歡迎批評指正!

【轉(zhuǎn)】https://mp.weixin.qq.com/s/eveZDOYN2STQXunrHN2isw


該文章在 2024/3/19 11:30:52 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊、財務(wù)費(fèi)用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved