继承的一个结果是派生于基类的类在方法和属性上有一定的重叠,   【从同一个基类派生出来的多个子类在方法和属性上有重叠】

因此,可以使用相同的语法处理从同一个基类实例化的对象。

例如,如果基类Animal有一个方法EatFood(),则从派生于它的类Cow和Chicken中调用这个方法,其语法是类似的:

Cow myCow=new Cow();

myCow.EatFood();

Chicken myChicken=new Chicken();

myChicken.EatFood();

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

Animal myAnimal=myCow;

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

myAnimal.EatFood();//调用基类的方法,输出结果是调用派生类方法中的执行代码

结果是调用派生类中的EatFood()执行代码。

注意,不能以相同的方式调用派生类上定义的方法,下面的代码不能运行:

myAnimal.Moo();  //myAnimal.Moo();//不能直接调用派生类的方法

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

Cow myNewCow=(Cow)myAnimal;//将基类变量转换为派生类变量,就可以调用派生类的方法

myNewCow.Moo();

如果原始变量的类型不是Cow或派生于Cow的类型,这个强制类型转换就会产生一个异常。有许多方式说明对象的类型是什么,详见下一章。

在派生于同一个类的不同对象上执行任务时,多态性是一种极为有效的技巧,其使用的代码最少。

注意,并不是只有共享同一个父类的类才能利用多态性。只要子类和孙子类在继承层次结构中有一个相同的类,它们就可以用相同的方式利用多态性。

还要注意,在C#中,所有的类都派生于同一个类object,object是继承层次结构中的根。

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

接口的多态性

前面介绍的接口概念是组合相关的属性和方法。http://www.cnblogs.com/chucklu/p/4049179.html

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

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

//consume单词是消耗的意思

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

这就提供了以相同方式访问多个对象的方式,且不依赖于一个公共的基类。在这段代码中,调用

consumeInterface.EatFood();
的结果是调用Cow和Chicken类的方法,这取决于哪个实例被赋予了接口类型的变量。

需要注意的是:派生类会继承其基类的接口。在上面的示例中,要么是Animal支持IConsume,要么是Cow和Chicken支持IConsume。

有共同基类的类不一定有共同的接口,反之亦然。

8.2.3多态性 第8章 面向对象编程简介相关推荐

  1. 8.2.2继承 第8章 面向对象编程简介

    继承是OOP最重要的特性之一.  OOP--面向对象 任何类都可以从另一个类中继承,这就是说,这个类拥有它继承的类的所有成员.在OOP中,被继承(继承也称为派生)的类称为父类(也称为基类).注意,C# ...

  2. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  3. JavaSE:第5章 面向对象编程(中)

    文章目录 JavaSE:第5章 面向对象编程(中) 5.1 OOP特征二:继承性 5.2 方法的重写(override) 5.3 四种访问权限修饰符 5.4 关键字:super 5.5 子类对象实例化 ...

  4. 第7章 面向对象编程(OOP) 《Kotin 编程思想·实战》

    第7章 面向对象编程(OOP) 7.1 面向对象思想 7.2 类与继承 7.2.1 类 7.2.1.1 抽象类 7.2.1.2 接口 7.2.1.3 枚举 7.2.1.4 注解 7.2.1.5 静态类 ...

  5. 《PHP精粹:编写高效PHP代码》——第1章面向对象编程

    本节书摘来自华章社区<PHP精粹:编写高效PHP代码>一书中的第1章面向对象编程,作者:(美) Davey Shafik,更多章节内容可以访问云栖社区"华章社区"公众号 ...

  6. Matlab AppDesigner编程教程第1章——面向对象编程

    Matlab AppDesigner编程教程第1章--面向对象编程 文章目录 Matlab AppDesigner编程教程第1章--面向对象编程 前言 一.什么是面向对象编程 二.使用步骤 1.新建类 ...

  7. 《Kotin 极简教程》第7章 面向对象编程(OOP)(1)

    第7章 面向对象编程(OOP) 最新上架!!!< Kotlin极简教程> 陈光剑 (机械工业出版社) 可直接打开京东,淘宝,当当===> 搜索: Kotlin 极简教程 http:/ ...

  8. 非零基础自学Java (老师:韩顺平) 第10章 面向对象编程(高级部分) 10.6 抽象类

    非零基础自学Java (老师:韩顺平) ✈[[零基础 快速学Java]韩顺平 零基础30天学会Java] 第10章 面向对象编程(高级部分) 文章目录 非零基础自学Java (老师:韩顺平) 第10章 ...

  9. ruby 新建对象_Ruby面向对象编程简介

    ruby 新建对象 by Nishant Mishra 由Nishant Mishra Ruby面向对象编程简介 (An Introduction to Object-Oriented Program ...

最新文章

  1. mysql常用数据类型的属性有哪些_MySQL数据类型和常用字段属性总结
  2. Windows Azure Mobile Services增加了对 Android的支持并扩展其适用范围至东亚地区
  3. python能print中文吗_win10中文版,python的print不能打印中文字符?
  4. 利用MS17-010渗透win7(32位)
  5. Photoshop扣除特定颜色背景
  6. python123作业怎么提交_python分析作业提交情况
  7. 三维网格精简算法java版_几种常见算法的精简版-
  8. oracle查询sql时间ain,Oracle SQL 时间查询
  9. linux对^M换行符的处理
  10. 虚拟座谈会:有关分布式存储的三个基本问题
  11. Linux的shell编程(一)
  12. html滑动验证图片,纯js实现图片滑块验证
  13. UE4 解除帧率限制
  14. ps模糊照片变清晰步骤东方逐梦
  15. 百度地图自定义图标不显示问题解决方案
  16. Nginx学习八:虚拟主机
  17. 学生选课系统功能分析
  18. 留言板(php+数据库)
  19. wow(2) : UI插件_EUI[2]_正式服配置分享
  20. 六级考研单词之路-十七

热门文章

  1. vidalia 更换浏览器代理
  2. 将实例的生成交给子类——工厂方法模式
  3. IDEA开发WebService遇到的问题和SOAPUI工具的使用
  4. MyBatis3-SqlSessionDaoSupport的使用
  5. hadoop的基本搭建
  6. 传说中的神器: shared_ptr/weak_ptr/scoped_ptr
  7. Cisco PVLAN的配置
  8. Widows Live Writer
  9. freemarker ftl模板_Web开发人员必会的模板引擎技术之Freemarker
  10. opencv4版本和3版本_Spring Boot 太狠了,一口气发布了 3 个版本!