<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        C#與.net高級(jí)編程 C#的多態(tài)介紹

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:42:15
        文檔

        C#與.net高級(jí)編程 C#的多態(tài)介紹

        C#與.net高級(jí)編程 C#的多態(tài)介紹:用virtual關(guān)鍵字標(biāo)記的方法稱為虛方法,如果子類希望改變虛方法的實(shí)現(xiàn)細(xì)節(jié)就必須使用 override關(guān)鍵字。 抽象類 abstract關(guān)鍵字 防止創(chuàng)建毫無意義的基本類,使用abstract關(guān)鍵字創(chuàng)建抽象基類,防止被實(shí)例化 使用abstract關(guān)鍵字創(chuàng)建抽象方法,強(qiáng)制每一個(gè)子類
        推薦度:
        導(dǎo)讀C#與.net高級(jí)編程 C#的多態(tài)介紹:用virtual關(guān)鍵字標(biāo)記的方法稱為虛方法,如果子類希望改變虛方法的實(shí)現(xiàn)細(xì)節(jié)就必須使用 override關(guān)鍵字。 抽象類 abstract關(guān)鍵字 防止創(chuàng)建毫無意義的基本類,使用abstract關(guān)鍵字創(chuàng)建抽象基類,防止被實(shí)例化 使用abstract關(guān)鍵字創(chuàng)建抽象方法,強(qiáng)制每一個(gè)子類

        用virtual關(guān)鍵字標(biāo)記的方法稱為虛方法,如果子類希望改變虛方法的實(shí)現(xiàn)細(xì)節(jié)就必須使用 override關(guān)鍵字。
        抽象類
        abstract關(guān)鍵字
        防止創(chuàng)建毫無意義的基本類,使用abstract關(guān)鍵字創(chuàng)建抽象基類,防止被實(shí)例化
        使用abstract關(guān)鍵字創(chuàng)建抽象方法,強(qiáng)制每一個(gè)子類重寫特定的方法,abstract成員沒有提供任何實(shí)現(xiàn)。
        (注:抽象方法只可以定義在抽象類中,如果不是這樣的話,就會(huì)收到編譯器錯(cuò)誤)
        成員投影
        如果派生類定義的成員和定義在蕨類中的成員一致,派生類投影了父類的版本。
        如:我們從一個(gè)不是自己創(chuàng)建的類來創(chuàng)建子類就是很可能發(fā)生這樣的情況(基類和子類出現(xiàn)同一個(gè)方法名。)
        解決方案:
        使用override關(guān)鍵字更新父版本,但是如果我們對(duì)定義基類的代碼沒有訪問權(quán)限,我們就不能將方法修改為虛方法。
        我們可以為派生類型的成員添加new 關(guān)鍵字。這樣就可以表明派生類型的實(shí)現(xiàn)故意設(shè)計(jì)為隱藏父類的版本。

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

        之前看到過類似的問題:如果面試時(shí)主考官要求你用一句話來描述多態(tài),盡可能的精煉,你會(huì)怎么回答?當(dāng)然答案有很多,每個(gè)人的理解和表達(dá)不盡相同,但我比較趨向這樣描述:通過繼承實(shí)現(xiàn)的不同對(duì)象調(diào)用相同的方法,表現(xiàn)出不同的行為,稱之為多態(tài)。 
        代碼如下:
        Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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對(duì)象數(shù)組中的不同的對(duì)象,在調(diào)用Eat()方法時(shí),表現(xiàn)出了不同的行為。
        多態(tài)的實(shí)現(xiàn)看起來很簡單,要完全理解及靈活的運(yùn)用c#的多態(tài)機(jī)制,也不是一件容易的事,有很多需要注意的地方。

        1.new的用法
        先看下面的例子。
        例2:
        代碼如下:
        Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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修飾時(shí),Cat的對(duì)象轉(zhuǎn)換為Animal對(duì)象后,調(diào)用的是Animal類中的Eat()方法。其實(shí)可以理解為,使用new關(guān)鍵字后,使得Cat中的Eat()方法和Animal中的Eat()方法成為毫不相關(guān)的兩個(gè)方法,只是它們的名字碰巧相同而已。所以, Animal類中的Eat()方法不管用還是不用virtual修飾,也不管訪問權(quán)限如何,或者是沒有,都不會(huì)對(duì)Cat的Eat()方法產(chǎn)生什么影響(只是因?yàn)槭褂昧薾ew關(guān)鍵字,如果Cat類沒用從Animal類繼承Eat()方法,編譯器會(huì)輸出警告)。

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

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

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

        例3:
        代碼如下:
        Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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,對(duì)方法Eat()進(jìn)行了重寫,類WolfDog又繼承自Dog,再一次對(duì)Eat()方法進(jìn)行了重寫,并很好地實(shí)現(xiàn)了多態(tài)。不管繼承了多少層,都可以在子類中對(duì)父類中已經(jīng)重寫的方法繼續(xù)進(jìn)行重寫,即如果父類方法用override修飾,如果子類繼承了該方法,也可以用override修飾,多層繼承中的多態(tài)就是這樣實(shí)現(xiàn)的。要想終止這種重寫,只需重寫方法時(shí)用sealed關(guān)鍵字進(jìn)行修飾即可。

        3. abstract-override實(shí)現(xiàn)多態(tài)
        先在我們?cè)趤碛懻撘幌掠胊bstract修飾的抽象方法。抽象方法只是對(duì)方法進(jìn)行了定義,而沒有實(shí)現(xiàn),如果一個(gè)類包含了抽象方法,那么該類也必須用abstract聲明為抽象類,一個(gè)抽象類是不能被實(shí)例化的。對(duì)于類中的抽象方法,可以再其派生類中用override進(jìn)行重寫,如果不重寫,其派生類也要被聲明為抽象類。看下面的例子。
        例4:
        代碼如下:
        Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 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一樣地實(shí)現(xiàn)多態(tài),包括多層繼承也是一樣的。不同之處在于,包含虛擬方法的類可以被實(shí)例化,而包含抽象方法的類不能被實(shí)例化。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        C#與.net高級(jí)編程 C#的多態(tài)介紹

        C#與.net高級(jí)編程 C#的多態(tài)介紹:用virtual關(guān)鍵字標(biāo)記的方法稱為虛方法,如果子類希望改變虛方法的實(shí)現(xiàn)細(xì)節(jié)就必須使用 override關(guān)鍵字。 抽象類 abstract關(guān)鍵字 防止創(chuàng)建毫無意義的基本類,使用abstract關(guān)鍵字創(chuàng)建抽象基類,防止被實(shí)例化 使用abstract關(guān)鍵字創(chuàng)建抽象方法,強(qiáng)制每一個(gè)子類
        推薦度:
        標(biāo)簽: 編程 c# 多態(tài)
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲av无码不卡私人影院| 国产成人亚洲综合网站不卡| 西西人体大胆免费视频| 最近中文字幕mv手机免费高清 | 亚洲人成人77777网站| 亚州**色毛片免费观看| 亚洲一级黄色视频| aa在线免费观看| 国产在线a免费观看| 亚洲精品无码久久久影院相关影片| 亚洲av一综合av一区| 久久狠狠躁免费观看| 国产一区二区三区免费视频| 久久水蜜桃亚洲AV无码精品| 国产小视频免费观看| 亚洲国产成人va在线观看网址| 免费的黄色网页在线免费观看| 中文字幕视频免费| 亚洲精品动漫在线| 成人免费福利电影| 欧洲精品码一区二区三区免费看| 丁香花免费高清视频完整版| 亚洲无人区午夜福利码高清完整版| 亚洲欧美日韩综合久久久| 四虎影视在线永久免费看黄| 久久久精品视频免费观看| 亚洲AV无码成人网站久久精品大 | 手机永久免费的AV在线电影网| 国色精品卡一卡2卡3卡4卡免费| 亚洲精品国精品久久99热一| 四虎影视成人永久免费观看视频 | 亚洲综合久久综合激情久久 | 亚洲天堂在线视频| 久久爰www免费人成| 中中文字幕亚洲无线码| 亚洲AV蜜桃永久无码精品| 亚洲国产精品无码观看久久| 亚洲一级特黄大片无码毛片 | 成人免费无码精品国产电影| 国产高清对白在线观看免费91| heyzo亚洲精品日韩|