C#向上转型与向下转型

原创 2015年09月15日 20:50:29

向上转型与向下转型

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

继承自非抽象类

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

总结:

向上转型是自由的;向下转型是有约束条件的。
非抽象继承,子类对象、父类对象的方法都能调到(用子类对象能调到子类对象的方法,用父类对象能调用父类对象的方法)。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

关于向上转型与向下转型的一点个人见解

正是大四实习期间,看李兴华老师的Java教学视频再打打基础时,就遇见向上转型与向下转型的问题,向上转型倒是通过视频看懂了,向下转型那一段看了好多遍都没懂,上网查资料,也大多一语带过,最后看了《Java...

C# 装箱,拆箱,向上转型,向下转型

c#中,数据类型分为值类型和引用类型,装箱和拆箱属于值类型和引用类型间的转换操作,一下简要介绍装箱和拆箱: 装箱:值类型向引用类型转换时发生, 当 CLR 对值类型进行装箱时,会将该值包装到 Sys...

向上转型与向下转型

1、相信大家老看见向上转型与向下转型(我应该去sun官方查下英文名称了……),咱们慢慢絮叨絮叨,啊哈哈哈!!...

C#——向上转型

在学习C#的过程中,一些基础知识比如数据类型、控制结构、数组等都与之前接触的语言大同小异,还能够理解,但是向上转型和向下转型这个概念还是第一次遇到。       有人说“如果子类中所需要的功能在父类中...

向上转型和向下转型

向上转型和向下转型: 向上转型(upcasting) instanceof关键字 该关键字判断一个变量的数据类型是否是某类型或其子类型,这样能保证向下转型时不会出错 同时会做编译时和运行时的检...
  • hephec
  • hephec
  • 2014年11月25日 12:53
  • 980

C# 向下转型 和 is运算符

向下类型转换: 由低层次类型转换为高层次类型称为向上类型转换,向上类型转换是自动进行的比如吧int型变量赋值给long型变量,把long型变量赋给double型变量,转换都是自动进行的,有派生类转换为...
  • Czhenya
  • Czhenya
  • 2017年09月06日 19:21
  • 300

C#中is和as、向上强制转换和向下强制装换之详解

首先,第一个出现的是is,有时,我们需要查看某个类是否实现了一个接口,这个时候就可以使用is关键字来找出答案: for(int I = 0; i< bees.Length; i++){ ...

向上转型之后的方法调用问题

假设定义了class A; 在定义class B extends A; 我们可以这样定义一个对象:A a = new B(); 栈中的引用变量是A,堆中的实例变量是B。 将子类的实例,赋值给父...

jquery的smartWizard插件使用方法

jquery的smartWizard插件常用在一些向导式的,按步骤的功能中,是的用户按照我们设定的步骤进行操作,这样一方面有较好的用户体验,可以将庞大的表格数据分解成多个步骤,是的每个步骤的数据量减少...

(转)jquery.validate分组验证

http://www.cnblogs.com/wangjq/archive/2011/03/13/1983024.html 在很多时候,我们都不是一步就将所有信息填写完整,然后提交。而是分步进行填写...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#向上转型与向下转型
举报原因:
原因补充:

(最多只允许输入30个字)