zoukankan      html  css  js  c++  java
  • (原创)c#学习笔记08--面向对象编程简介02--OOP技术03--多态性

    8.2.3  多态性

      继承的一个结构是派生于基类的类在方法和属性上有一定的重叠,因此,可以使用相同的语法处理从同一个基类实例化的对象。例如,如果基类 Animal 有一个 EatFood()方法,则从派生于它的类Cow和Chicken中调用这个方法,其语法是类似的:

          Cow myCow = new Cow(); 
          Chicken myChicken = new Chicken(); 
          myCow.EatFood(); 
          myChicken.EatFood();  

      多态性则更推进了一步。可以把某个派生类型的变量赋给基本类型的变量,例如:

    Animal myAnimal = myCow; 

      不需要进行强制类型转换,就可以通过这个变量调用基类的方法:

    myAnimal.EatFood(); 

      结果是调用派生类中的EatFood()的实现代码。注意,不能以相同的方式调用派生类上定义的方法,下面的代码不能运行:

    myAnimal.Moo(); 

      但是,可以把基本类型的变量转换为派生类变量,调用派生类的方法,如下所示:

          Cow myNewCow = (Cow)myAnimal; 
          myNewCow.Moo(); 

      如果原始变量(上面的变量:myAnimal )的类型不是Cow 或派生于Cow 的类型,这个强制类型转换就会引发一个异常。

      在派生于同一个类的不同时象上执行任务时,多态性是一种极有效的技巧,其使用的代码最少。注意并不是只有共享同一个父类的类才能利用多态性。只要子类和孙子类在继承层次结构中有一个相同的类,它们就可以用同样的方式利用多态性。

      还要注意,在 C#中,所有的类都派生于同一个类 object,object 是继承层次结构中的根。所以可以把所有对象看作是object类的实例。这就是在建立字符串时,Console.WriteLine()可以处理无数多种参数组合的原因。第一个参数后面的每个参数都可以看作是一个object 实例,所以可以把任何对象的输出结果写到屏幕上。为此,需要调用方法 ToString()(object 的一个成员),我们可以重写这个方法,为自己的类提供合适的实现代码,或者使用默认实现代码,返回类名(根据它所在的名称空间,返回类的修饰名)。

    接口的多态性

      尽管不能像对象那样实例化接口,但可以建立接口类型的变量,然后就可以在支持该接口的对象上,使用这个变量访问该接口提供的方法和属性。

      例如,假定不使用基类Animal提供EatFood()方法,而是把该方法放在IConsume接口上。Cow和Chicken类也支持这个接口,唯一的区别是它们必须提供EatFood()方法的实现代码(因为接口不包含实现代码),接着就可以使用下述代码访问该方法了:

          Cow myCow = new Cow(); 
          Chicken myChicken = new Chicken(); 
          IConsume consumeInterface; 
          consumeInterface = myCow; 
          consumeInterface.EatFood(); 
          consumeInterface = myChicken; 
          consumeInterface.EatFood();

      这就提供了以相同方式访问多个对象的简单方式,且不依赖于一个公共的基类例如,这个接口可以由派生于Vegetable的VenusFlyTrap类实现,而不是由Animal实现:

          VenusFlyTrap myVenusFlyTrap = new VenusFlyTrap(); 
          IConsume consumeInterface; 
          consumeInterface = myVenusFlyTrap; 
          consumeInterface.EatFood();

      在这段代码中,调用 consumeInterface.EatFood()的结果是调用 Cow、Chicken 或 VenusFlyTrap类的EatFood()方法,这取决于哪个实例被赋予了接口类型的变量。

      注意, 派生类会继承其基类支持的接口。在上面的第一个示例中,要么是Animal支持IConsume,要么是Cow和Chicken支持IConsume有共同基类的类不一定有共同的接口,反之亦然

      

  • 相关阅读:
    Spring Boot 定时+多线程执行
    Spring Boot + Vue Element实现Excel文件上传、解析、下载(含完整实现过程)
    立个flag,2020年比2019年产出提升10倍
    《Google工作法》读书笔记
    学习Go语言(二)快速入门
    学习Go语言(一)环境安装及HelloWorld
    WPF 自定义控件缩放
    上、下位机软件通信时,结构体的内存对齐问题
    C 语言能不能在头文件定义全局变量?
    注释格式
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4930983.html
Copyright © 2011-2022 走看看