C#向上轉型與向下轉型(轉)


原文地址:https://blog.csdn.net/wangqingbo0829/article/details/48474173

 

向上轉型:將子類對象轉為父類對象。此處父類對象可以是接口。
向下轉型:把父類對象轉為子類對象。
討論兩種繼承:繼承自抽象類、繼承自非抽象類(這兩種繼承所對應的轉型稍有不同)

繼承自非抽象類

父類:動物類Animal(有一個叫聲方法“call()”)
    class Animal { public void call() { Console.WriteLine("無聲的叫喚"); } }
 子類:狗類Dog(繼承於“動物類”,覆蓋父類“call()”方法,擴展嗅覺靈敏“ smell()”方法)
    class Dog : Animal { // new的作用是隱藏父類的同名方法
        public new void call() { Console.WriteLine("叫聲:汪~汪~汪~"); } public void smell() { Console.WriteLine("嗅覺相當不錯!"); } }

向上轉型:將子類對象轉為父類對象。此處父類對象可以是接口。

轉化后的父類對象具有父類所有方法,若方法被子類重寫override,那么實際調用時,調用的是重寫后的實現。同時支持子類到父類的強轉。特注:但不能調用子類擴展方法(父類不具有的方法)。
            Animal animal = new Dog();             //向上轉型①
 animal.call(); //打印出“無聲的叫喚”,調用的是父類本身的call方法。 // animal.smell(); //出錯,不存在此方法。
目前看來,感覺animal跟Dog一點關系也沒有。但請繼續往下看

向下轉型:把父類對象轉為子類對象。

    經②轉化后的子類對象,跟一般的繼承子類對象一樣。具有子類所有方法(包括重寫方法)+父類所有方法(被重寫的方法,按重寫的算。)

    例:

Dog dog = (Dog)animal;                      //向下轉型②
dog.call();                 //打印出“叫聲:汪~汪~汪~”,即調用的是Dog類的call方法。
dog.smell();                //打印出“嗅覺相當不錯!”,即子類方法可用。

特注:若Animal animal = new Dog()改成Animal animal = new Animal(),那么Dog dog = (Dog)animal ③ 將不被支持,而出錯。這是相當於用父類來替換子類,因為子類具有擴展,父類不能做到完全替代。

// Dog dog2 = new Animal(); //編譯都無法通過,報錯“存在一個顯示轉換” // Dog dog3 =(Dog)new Animal(); //運行報錯,報錯“無法將Animal類型轉化為Dog類型”<span style="font-size:18px;">s④</span>
③與④類同。
    Animal animal = new Dog()好似給animal聲明了一個大的空間(放置Dog的空間),用的時候,允許有空隙;同等大小的內容(Dog對象)剛好容納,很貼身;小一些的內容(Animal對象)放到里面,雖有空隙,但是沒問題的


繼承自抽象類

父類:動物類Animal_a(有一個叫聲方法“call()”) 
    abstract class Animal_a { public abstract void call(); }
子類:狗類Dog_a(繼承於“動物類”,實現父類“call()”方法,擴展嗅覺靈敏“ smell()”方法)


    class Dog_a : Animal_a { public override void call() { Console.WriteLine("叫聲:汪~汪~汪~"); } public void smell() { Console.WriteLine( "嗅覺相當不錯!"); } }
這里是一般的繼承知識:
Animal_a animal_a = new Dog_a();               //向上轉型
animal_a.call();      //打印出“叫聲:汪~汪~汪~” // animal_a.smell(); //不存在此方法
子類實現抽象類,調用方法時,自動找到子類同名方法,執行子類同名方法。向上轉型時,轉型后的對象只具有父類方法和子類對父類重新(實現)的方法。

總結:

向上轉型是自由的;向下轉型是有約束條件的。
非抽象繼承,子類對象、父類對象的方法都能調到(用子類對象能調到子類對象的方法,用父類對象能調用父類對象的方法)。










免責聲明!

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



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