欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

深入淺出OOP(三):多態(tài)和繼承(動態(tài)綁定/運行時多態(tài))

在前面的文章中,我們介紹了編譯期多態(tài)、params關(guān)鍵字、實例化、base關(guān)鍵字等。本節(jié)我們來關(guān)注另外一種多態(tài):運行時多態(tài), 運行時多態(tài)也叫遲綁定。

十余年建站經(jīng)驗, 做網(wǎng)站、成都網(wǎng)站設(shè)計客戶的見證與正確選擇。創(chuàng)新互聯(lián)提供完善的營銷型網(wǎng)頁建站明細(xì)報價表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。

 

運行時多態(tài)或遲綁定、動態(tài)綁定

在C#語音中,運行時多態(tài)也叫方法重寫(overriding),我們可以在子類中overriding基類的同簽名函數(shù),使用“virtual & override”關(guān)鍵字即可。

 

C#的New、Override關(guān)鍵字

深入淺出OOP(三): 多態(tài)和繼承(動態(tài)綁定/運行時多態(tài))

創(chuàng)建一個console 示例工程,命名為InheritanceAndPolymorphism。在Program.cs基礎(chǔ)上,再添加2個類文件,分別命名為ClassA.cs、ClassB.cs。拷貝如下代碼:

public class ClassA
    {        public void AAA()
        {
            Console.WriteLine("ClassA AAA");
        }        public void BBB()
        {
            Console.WriteLine("ClassA BBB");
        }        public void CCC()
        {
            Console.WriteLine("ClassA CCC");
        }
    }

 

ClassB:

public class ClassB
    {        public void AAA()
        {
            Console.WriteLine("ClassB AAA");
        }        public void BBB()
        {
            Console.WriteLine("ClassB BBB");
        }        public void CCC()
        {
            Console.WriteLine("ClassB CCC");
        }
    }

在上面的代碼中,我們可以看到ClassA、ClassB有同樣簽名的方法,可以在program.cs中直接使用。

我們對代碼再做休整,結(jié)構(gòu)如下:

/// <summary>
    /// ClassB, acting as a base class    /// </summary>
    public class ClassB
    {        public void AAA()
        {
            Console.WriteLine("ClassB AAA");
        }        public void BBB()
        {
            Console.WriteLine("ClassB BBB");
        }        public void CCC()
        {
            Console.WriteLine("ClassB CCC");
        }
    }    /// <summary>
    /// Class A, acting as a derived class    /// </summary>
    public class ClassA : ClassB
    {        public void AAA()
        {
            Console.WriteLine("ClassA AAA");
        }        public void BBB()
        {
            Console.WriteLine("ClassA BBB");
        }        public void CCC()
        {
            Console.WriteLine("ClassA CCC");
        }
    }

 

Program.cs

    /// <summary>
    /// Program: used to execute the method.    /// Contains Main method.    /// </summary>
    public class Program
    {        private static void Main(string[] args)
        {
            ClassA x = new ClassA();
            ClassB y=new ClassB();
            ClassB z=new ClassA();

            x.AAA(); x.BBB(); x.CCC();
            y.AAA(); y.BBB();y.CCC();
            z.AAA(); z.BBB(); z.CCC();
        }
    }

F5,運行代碼,結(jié)果如下:

ClassA AAA

ClassA BBB

ClassA CCC

ClassB AAA

ClassB BBB

ClassB CCC

ClassB AAA

ClassB BBB

ClassB CCC

但同時,在VS的Output窗口,我們獲得了3個Warnings:

'InheritanceAndPolymorphism.ClassA.AAA()' hides inherited member

'InheritanceAndPolymorphism.ClassB.AAA()'. Use the new keyword if hiding was intended.

'InheritanceAndPolymorphism.ClassA.BBB()' hides inherited member

'InheritanceAndPolymorphism.ClassB.BBB()'. Use the new keyword if hiding was intended.

'InheritanceAndPolymorphism.ClassA.CCC()' hides inherited member

'InheritanceAndPolymorphism.ClassB.CCC()'. Use the new keyword if hiding was intended.

這些Warnings的原因是因為子類和基類的AAA、BBB、CCC方法簽名相同,盡管從執(zhí)行上看優(yōu)先執(zhí)行子類同簽名的方法,但是可能會有潛在的問題,故Warnings提出。

 

重構(gòu)實驗

基于上面的Warning,我們手動修改代碼,看看如何消除這些Warnings。

先給子類添加new、override關(guān)鍵字試試:

/// <summary>
    /// Class A, acting as a derived class    /// </summary>
    public class ClassA : ClassB
    {        public override void AAA()
        {
            Console.WriteLine("ClassA AAA");
        }        public new void BBB()
        {
            Console.WriteLine("ClassA BBB");
        }        public void CCC()
        {
            Console.WriteLine("ClassA CCC");
        }
    }

 

執(zhí)行的結(jié)果是報錯了:

Error: 'InheritanceAndPolymorphism.ClassA.AAA()': cannot override inherited member 'InheritanceAndPolymorphism.ClassB.AAA()' because it is not marked virtual, abstract, or override

 

深入淺出OOP(三): 多態(tài)和繼承(動態(tài)綁定/運行時多態(tài))

從這個錯誤提示信息看,我們需要修改基類方法,如添加virtual關(guān)鍵字。

/// <summary>
    /// ClassB, acting as a base class    /// </summary>
    public class ClassB
    {        public virtual void AAA()
        {
            Console.WriteLine("ClassB AAA");
        }        public virtual void BBB()
        {
            Console.WriteLine("ClassB BBB");
        }        public virtual void CCC()
        {
            Console.WriteLine("ClassB CCC");
        }
    }    /// <summary>
    /// Class A, acting as a derived class    /// </summary>
    public class ClassA : ClassB
    {        public override void AAA()
        {
            Console.WriteLine("ClassA AAA");
        }        public new void BBB()
        {
            Console.WriteLine("ClassA BBB");
        }        public void CCC()
        {
            Console.WriteLine("ClassA CCC");
        }
    }    /// <summary>
    /// Program: used to execute the method.    /// Contains Main method.    /// </summary>
    public class Program
    {        private static void Main(string[] args)
        {
            ClassB y = new ClassB();
            ClassA x = new ClassA();
            ClassB z = new ClassA();

            y.AAA(); y.BBB(); y.CCC();
            x.AAA(); x.BBB(); x.CCC();
            z.AAA(); z.BBB(); z.CCC();

            Console.ReadKey();
        }
    }

執(zhí)行,則無Warning了,通過這個實例,我們得知通過在基類添加Virtual關(guān)鍵字授權(quán)其子類可override基類同簽名方法的權(quán)限,方便了OOP的擴(kuò)展。

 

3個類的運行時多態(tài)

ClassA\ClassB基礎(chǔ)上,下面添加ClassC,看看3個類繼承關(guān)系的運行時多態(tài):

/// <summary>
    /// ClassB, acting as a base class    /// </summary>
    public class ClassB
    {        public  void AAA()
        {
            Console.WriteLine("ClassB AAA");
        }        public virtual void BBB()
        {
            Console.WriteLine("ClassB BBB");
        }        public virtual void CCC()
        {
            Console.WriteLine("ClassB CCC");
        }
    }    /// <summary>
    /// Class A, acting as a derived class    /// </summary>
    public class ClassA : ClassB
    {        public virtual void AAA()
        {
            Console.WriteLine("ClassA AAA");
        }        public new void BBB()
        {
            Console.WriteLine("ClassA BBB");
        }        public override void CCC()
        {
            Console.WriteLine("ClassA CCC");
        }
    }    /// <summary>
    /// Class C, acting as a derived class    /// </summary>
    public class ClassC : ClassA
    {        public override void AAA()
        {
            Console.WriteLine("ClassC AAA");
        }        public void CCC()
        {
            Console.WriteLine("ClassC CCC");
        }
    }    /// <summary>
    /// Program: used to execute the method.    /// Contains Main method.    /// </summary>
    public class Program
    {        private static void Main(string[] args)
        {
            ClassB y = new ClassA();
            ClassB x = new ClassC();
            ClassA z = new ClassC();

            y.AAA(); y.BBB(); y.CCC();
            x.AAA(); x.BBB(); x.CCC();
            z.AAA(); z.BBB(); z.CCC();

            Console.ReadKey();
        }
    }

運行結(jié)果:

ClassB AAA

ClassB BBB

ClassA CCC

ClassB AAA

ClassB BBB

ClassA CCC

ClassC AAA

ClassA BBB

ClassA CCC

如果基類聲明了virtual 關(guān)鍵字,子類可使用override修飾符實現(xiàn)運行時多態(tài):只有在編譯器動態(tài)決定是否被調(diào)用。

如果未標(biāo)明virtual或非virtual,則方法是否被調(diào)用在編譯期就能決定。

 

深入淺出OOP(三): 多態(tài)和繼承(動態(tài)綁定/運行時多態(tài))

 

再看看下面的例子:

internal class A
    {        public virtual void X()
        {
        }
    }    internal class B : A
    {        public new void X()
        {
        }
    }    internal class C : B
    {        public override void X()
        {
        }
    }

F5運行,結(jié)果報錯了:

Error: 'InheritanceAndPolymorphism.C.X()': cannot override inherited member 'InheritanceAndPolymorphism.B.X()' because it is not marked virtual, abstract, or override

錯誤的原因是A中定義了virtual的X函數(shù),在B中用new關(guān)鍵字隱藏了A中的X函數(shù)。當(dāng)C嘗試通過override關(guān)鍵字的時候,是獲得不了A中的virtual關(guān)鍵字X函數(shù)的,既在C中X函數(shù)為非Virtual的,故不能override。

 

切斷關(guān)系

internal class A
    {        public virtual void X()
        {
            Console.WriteLine("Class: A ; Method X");
        }
    }    internal class B : A
    {        public new virtual void X()
        {
            Console.WriteLine("Class: B ; Method X");
        }
    }    internal class C : B
    {        public override void X()
        {
            Console.WriteLine("Class: C ; Method X");
        }
    }    /// <summary>
    /// Program: used to execute the method.    /// Contains Main method.    /// </summary>
    public class Program
    {        private static void Main(string[] args)
        {
            A a = new C();
            a.X();
            B b = new C();
            b.X();

            Console.ReadKey();
        }
    }

執(zhí)行結(jié)果如下:

Class: A ; Method X
Class: C ; Method X

深入淺出OOP(三): 多態(tài)和繼承(動態(tài)綁定/運行時多態(tài))

在這里,我們通過在B類中添加new Virtual修飾符,然后在C中即可使用B中Virtual的X函數(shù)了。

 

4個類的運行時多態(tài)

深入淺出OOP(三): 多態(tài)和繼承(動態(tài)綁定/運行時多態(tài))

在上面繼承上,在運行時多態(tài)中添加第四個類:ClassD。

/// <summary>
    /// Class A    /// </summary>
    public class ClassA
    {        public virtual void XXX()
        {
            Console.WriteLine("ClassA XXX");
        }
    }    /// <summary>
    /// ClassB    /// </summary>
    public class ClassB:ClassA 
    {        public override void XXX()
        {
            Console.WriteLine("ClassB XXX");
        }
    }    /// <summary>
    /// Class C    /// </summary>
    public class ClassC : ClassB
    {        public virtual new void XXX()
        {
            Console.WriteLine("ClassC XXX");
        }
    }    /// <summary>
    /// Class D    /// </summary>
    public class ClassD : ClassC
    {        public override void XXX()
        {
            Console.WriteLine("ClassD XXX");
        }
    }    /// <summary>
    /// Program: used to execute the method.    /// Contains Main method.    /// </summary>
    public class Program
    {        private static void Main(string[] args)
        {
            ClassA a = new ClassD();
            ClassB b = new ClassD();
            ClassC c=new ClassD();
            ClassD d=new ClassD();
           
            a.XXX();
            b.XXX();
            c.XXX();
            d.XXX();

            Console.ReadKey();
        }
    }

 

執(zhí)行結(jié)果如下:

ClassB XXX

ClassB XXX

ClassD XXX

ClassD XXX

第一行輸出中,來自a.XXX()函數(shù) , 我們在 ClassA中定義了XXX函數(shù),然后在ClassB中使用new關(guān)鍵字切斷了virtual關(guān)系--對子類而言。因此XXX函數(shù)從ClassC開始成為新的virtual函數(shù),在這個代碼中a是ClassD的實例,但是聲明的為ClassA,故從下往上找,找到ClassB的XXX函數(shù),打印并輸出結(jié)果。

 

永無止境的循環(huán)

 

/// <summary>
    /// Class A    /// </summary>
    public class ClassA
    {        public virtual void XXX()
        {
            Console.WriteLine("ClassA XXX");
        }
    }    /// <summary>
    /// ClassB    /// </summary>
    public class ClassB:ClassA 
    {        public override void XXX()
        {
            ((ClassA)this).XXX();
            Console.WriteLine("ClassB XXX");
        }
    }   
    /// <summary>
    /// Program: used to execute the method.    /// Contains Main method.    /// </summary>
    public class Program
    {        private static void Main(string[] args)
        {
            ClassA a = new ClassB();
            a.XXX();
           
        }
    }

運行報錯:

Error: {Cannot evaluate expression because the current thread is in a stack overflow state.}

在這個例子中,((ClassA)this).XXX(); 導(dǎo)致了循環(huán)調(diào)用,修改為base.XXX即可修復(fù)這個強(qiáng)轉(zhuǎn)導(dǎo)致的循環(huán)調(diào)用。

 

結(jié)論

  • 在C#中,子類對象可賦值給一個基類對象;相反需要強(qiáng)轉(zhuǎn)。

  • override關(guān)鍵字用于子類重寫同簽名的基類virtual函數(shù)

  • 用new和override可重寫基類virtual的同簽名函數(shù)

  • virtual修飾符的函數(shù),只能在運行時決定是否被執(zhí)行

  • 函數(shù)未用virtual修飾,則在編譯期即可決定是否被調(diào)用

 

原文鏈接:Diving in OOP (Day 3): Polymorphism and Inheritance (Dynamic Binding/Run Time Polymorphism)

文章名稱:深入淺出OOP(三):多態(tài)和繼承(動態(tài)綁定/運行時多態(tài))
分享網(wǎng)址:http://chinadenli.net/article16/ppcigg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、微信公眾號、做網(wǎng)站、云服務(wù)器、網(wǎng)站排名、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
亚洲中文字幕熟女丝袜久久| 日韩成人免费性生活视频| 青青操视频在线播放免费| 日韩免费成人福利在线| 在线亚洲成人中文字幕高清| 超薄肉色丝袜脚一区二区| 成年女人下边潮喷毛片免费| 日韩av亚洲一区二区三区| 国产在线视频好看不卡| 91后入中出内射在线| 老司机精品视频免费入口| 亚洲中文字幕日韩在线| 欧美不卡午夜中文字幕| 欧美中文字幕一区在线| 国产综合欧美日韩在线精品| 99秋霞在线观看视频| 日本免费一区二区三女| 中文字幕精品人妻一区| 亚洲精品中文字幕一二三| 情一色一区二区三区四| 好骚国产99在线中文| 午夜福利视频偷拍91| 免费一级欧美大片免费看| 日韩一级免费中文字幕视频| 伊人天堂午夜精品草草网| 亚洲视频一区自拍偷拍另类| 国产超薄黑色肉色丝袜| 熟妇人妻av中文字幕老熟妇| 亚洲最新av在线观看| 国产av熟女一区二区三区蜜桃| 五月天综合网五月天综合网| 欧美一区二区三区性视频| 极品少妇一区二区三区精品视频 | 中国黄色色片色哟哟哟哟哟哟| 日本不卡在线视频中文国产| 福利专区 久久精品午夜| 麻豆精品视频一二三区| 国产毛片对白精品看片| 狠狠做五月深爱婷婷综合| 成人日韩视频中文字幕| 日韩成人免费性生活视频|