亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中的多態深入理解

2020-01-24 02:52:07
字體:
來源:轉載
供稿:網友

封裝、繼承、多態,面向對象的三大特性,前兩項理解相對容易,但要理解多態,特別是深入的了解,對于初學者而言可能就會有一定困難了。我一直認為學習OO的最好方法就是結合實踐,封裝、繼承在實際工作中的應用隨處可見,但多態呢?也許未必,可能不經意間用到也不會把它跟“多態”這個詞對應起來。在此拋磚引玉,大家討論,個人能力有限,不足之處還請指正。

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

例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對象數組中的不同的對象,在調用Eat()方法時,表現出了不同的行為。

多態的實現看起來很簡單,要完全理解及靈活的運用c#的多態機制,也不是一件容易的事,有很多需要注意的地方。

1. 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();
        }
    }


運行結果為:
Animal eat...
Animal eat...
Cat eat...

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

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

2.override實現多態
真正的多態使用override來實現的?;剡^去看前面的例1,在基類Animal中將方法Eat()用virtual標記為虛擬方法,再在派生類Cat和Dog中用override對Eat()修飾,進行重寫,很簡單就實現了多態。需要注意的是,要對一個類中一個方法用override修飾,該類必須從父類中繼承了一個對應的用virtual修飾的虛擬方法,否則編譯器將報錯。

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

例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();
            }
        }
}


運行結果為:
Animal eat...
Dog eat...
WolfDog eat...

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

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

例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();
            }
        }
    }


運行結果為:
Cat eat...
Dog eat...
Wolfdog eat...

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一区第一页| 国产欧美精品一区二区三区-老狼| 欧美在线视频免费观看| 综合网中文字幕| 欧美国产视频日韩| 国产97在线视频| 91精品啪在线观看麻豆免费| 国产一区二区三区久久精品| 中文日韩在线观看| 青草成人免费视频| 欧美制服第一页| 欧美理论片在线观看| 亚洲欧美另类在线观看| 中文字幕在线亚洲| 丝袜情趣国产精品| 亚洲影视中文字幕| 国产成人福利视频| 亚洲精品久久久久久久久久久| 国产精品美腿一区在线看| 精品露脸国产偷人在视频| 亚洲精品www久久久久久广东| 国产精品久久久久77777| 国产精品成人va在线观看| 亚洲欧美另类在线观看| 中文字幕免费精品一区| 久久久免费av| 中文欧美日本在线资源| 亚洲男女自偷自拍图片另类| 久久久91精品| 成人免费直播live| 久久中文字幕视频| 久久精品99国产精品酒店日本| 欧美性猛交xxxxx免费看| 国产亚洲人成a一在线v站| 日韩不卡在线观看| 国产精品丝袜高跟| 91精品综合久久久久久五月天| 日本精品视频在线| 欧美肥臀大乳一区二区免费视频| 国产精品美女视频网站| 国产亚洲欧美一区| 欧美日韩美女视频| 亚洲精品国产美女| 欧美色播在线播放| 最近2019年日本中文免费字幕| 91精品视频在线免费观看| 欧美激情一区二区三区成人| 国产亚洲欧美另类中文| 国产一区二区三区中文| 91精品国产成人| 亚洲天堂男人的天堂| 成人激情视频免费在线| 黑人与娇小精品av专区| 啪一啪鲁一鲁2019在线视频| 欧美激情国产高清| 久久亚洲私人国产精品va| 亚洲精品国产精品久久清纯直播| 欧美激情网友自拍| 91精品国产精品| 成人精品在线观看| 国产亚洲精品美女久久久久| 日韩av一区二区在线观看| 欧美亚洲国产视频| 久久久久在线观看| 欧美日韩国产一区二区| 激情懂色av一区av二区av| 久久国产一区二区三区| 亚洲精品有码在线| 日韩欧美在线视频| 性欧美长视频免费观看不卡| 久久精品视频亚洲| 国产福利视频一区二区| 国产欧美日韩免费看aⅴ视频| 亚洲色图av在线| 欧美激情精品久久久久久| 午夜精品在线观看| 欧美超级乱淫片喷水| 久久精品中文字幕免费mv| 亚洲欧美激情四射在线日| 久久久av免费| 伦伦影院午夜日韩欧美限制| 国产精品入口日韩视频大尺度| 尤物九九久久国产精品的分类| 欧美日韩国产在线| 日韩精品电影网| 北条麻妃久久精品| 亚洲精品福利在线| 国内精品小视频| 欧美一区二区三区图| 亚洲日本欧美日韩高观看| 欧美激情伊人电影| y97精品国产97久久久久久| 欧美另类极品videosbestfree| 欧美黑人一级爽快片淫片高清| 日韩av片免费在线观看| 亚洲国产精品999| 欧美日韩一区二区免费视频| 日韩电影中文字幕在线观看| 亚洲人成网站999久久久综合| 92国产精品久久久久首页| 精品亚洲一区二区三区在线观看| 92看片淫黄大片看国产片| 亚洲国产精品女人久久久| 一本一道久久a久久精品逆3p| 国产91网红主播在线观看| 精品久久久久久亚洲国产300| 日韩电影大全免费观看2023年上| 亚洲在线视频观看| 亚洲天堂成人在线| 黑丝美女久久久| 中文在线资源观看视频网站免费不卡| 亚洲人午夜精品| 国产精品色午夜在线观看| 亚洲最大av在线| 精品久久久精品| 欧美日韩另类字幕中文| 欧美日韩国产黄| 国产一区二区丝袜| 精品久久久久久久久国产字幕| 91爱爱小视频k| 亚洲伊人久久综合| 九九热99久久久国产盗摄| 中文日韩在线视频| 精品久久久久久久大神国产| 国产精品香蕉av| 亚洲电影免费观看高清完整版| 国产成人在线播放| 久久网福利资源网站| 98精品国产高清在线xxxx天堂| 亚洲欧美另类国产| 国产人妖伪娘一区91| 国产日韩欧美日韩大片| 日韩美女免费观看| 国产精品欧美风情| 国产精品高精视频免费| 欧美精品精品精品精品免费| 国内成人精品视频| 国产成人自拍视频在线观看| 欧美黑人xxxⅹ高潮交| 中文字幕不卡在线视频极品| 最近日韩中文字幕中文| 亚洲欧美中文在线视频| 亚洲人成网站777色婷婷| 亚洲精品色婷婷福利天堂| 亚洲欧美日韩在线高清直播| 97成人在线视频| 欧美午夜精品久久久久久浪潮| 亚洲国产高潮在线观看| 少妇久久久久久| 亚洲精品suv精品一区二区| 日本久久久久久久久久久| 欧美体内谢she精2性欧美| 日韩美女写真福利在线观看| 97精品视频在线| 亚洲第一精品福利| 在线观看91久久久久久| 久久大大胆人体| 久久精品视频亚洲| 一夜七次郎国产精品亚洲| 国产精品成人aaaaa网站| 亚洲一区www| 视频一区视频二区国产精品| 亚洲第一网中文字幕| 国产一区私人高清影院|