C#——向上转型

简介: 在学习C#的过程中,一些基础知识比如数据类型、控制结构、数组等都与之前接触的语言大同小异,还能够理解,但是向上转型这个概念还是第一次遇到。

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


      学习了一下后大致理解如下:


      向上转型就是将子类转型成父类,对象可以作为它本身的类型使用。


      先来看一段代码:


public class Animal
    {
        public virtual void Eat()
        {
            Console.WriteLine("我是动物,我要吃东西!");
        }
    }
    public class Bird : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("我是鸟,我要吃东西!");
        }
    }
    class Test
    {
        static void Main(string[] args)
        {
            Animal animal = new Bird();  //向上转型
              animal.Eat();
        }
    }


      上述例子中我们定义了一个动物类(其中有吃东西的方法),鸟类继承了动物类(重写了基类中吃东西的方法),主函数中生命animal为Animal类型的对象,但运行结果并不是我们预期的那样,而是显示“我是鸟,我要吃东西!”。


20.png


       对于这个例子。声明animal的时候,animal的类型为Animal。但是animal所指向的实例为Animal的子类即Bird。


          当然有向上转型就有向下转型,方式当然也是相反,即将父类转换成子类。


       在网上看到一个问题,有人说“如果子类中所需要的功能在父类中存在,就使用向上转型;如果父类所需要的功能在子类中存在,就使用向下转型”,但是如上例所述,Bird是Animal的子类,Bird已经继承了Animal中的方法,为什么还要使用向下转型呢?即为什么定义Animal的时候要用“Animal animal=new Bird();”而不是“Bird animal=new Bird();”呢?


         恳请朋友们不吝赐教,提出宝贵的意见和建议。


相关文章
|
8月前
|
Java
这就是泛型方法?
这就是泛型方法?
|
C#
C#方法重写
C#方法重写
77 0
|
编译器
【多态-动态绑定-向上转型-抽象类】
【多态-动态绑定-向上转型-抽象类】
55 0
|
安全 Java 编译器
C++的向上转型
在 C/C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍。例如: int a = 10.9; printf("%d\n", a); 输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如: float b = 10; printf("%f\n", b); 输出结果为 10.000000,编译器会自动添
|
测试技术 uml
super关键字
super关键字
62 0
|
编译器
匿名对象与构造器
匿名对象与构造器
80 0
对象的向上转型/向下转型笔记
对象的向上转型/向下转型笔记
|
编译器
Super关键字详解
Super关键字详解
101 0