C#向上转型与向下转型

来源:互联网 发布:适用于编程的字体 编辑:程序博客网 时间:2024/06/06 20:12

向上转型与向下转型

向上转型:将子类对象转为父类对象。此处父类对象可以是接口。
向下转型:把父类对象转为子类对象。 
讨论两种继承:继承自抽象类、继承自非抽象类(这两种继承所对应的转型稍有不同)

继承自非抽象类

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

总结:

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