zoukankan      html  css  js  c++  java
  • 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();  //不存在此方法
    子类实现抽象类,调用方法时,自动找到子类同名方法,执行子类同名方法。向上转型时,转型后的对象只具有父类方法和子类对父类重新(实现)的方法。

    总结:

    向上转型是自由的;向下转型是有约束条件的。
    非抽象继承,子类对象、父类对象的方法都能调到(用子类对象能调到子类对象的方法,用父类对象能调用父类对象的方法)。









  • 相关阅读:
    HTML基础
    一次由任意文件漏洞开始的渗透测试过程
    谈一谈信息泄露这件事
    浅谈任意文件下载漏洞的利用
    [原创] 一次渗透测试过程--从外网进内网
    一次绕过360+诺顿的提权过程
    漏洞挖掘高级方法
    新型勒索软件Magniber正瞄准韩国、亚太地区开展攻击
    Microsoft Edge 浏览器远程代码执行漏洞POC及细节(CVE-2017-8641)
    Office远程代码执行漏洞CVE-2017-0199复现
  • 原文地址:https://www.cnblogs.com/fuyouchen/p/9363989.html
Copyright © 2011-2022 走看看