面向对象技术第一讲  多态性

 

什么是多态?为什么要支持多态?

多态是一种普遍存在的现象,如water的三种形态:冰﹑水﹑汽,又如算术运算1+1, 1+0.5, 1/2+0.5等。

多态性用一句经典的英文来解释就是:a value can belong to multiple types.

那么在软件设计中支持多态有什么好处呢?首先,可以使程序中的数学运算符合常规的数学运算规则,为程序提供更强的表达能力;其次使得对不同类型的数据有同样的操作语义,可以实现程序的重用,而重用标识的资源,可以提高程序的可读性和可理解性。

软件系统支持多态的前提就是能够静态(编译时)或者动态(运行时)地确定类型。

多态的分类有哪些?

多态分为两种:通用的多态(universal)和特定的多态(ad hoc)。两者的区别是前者对工作的类型不加限制,允许对不同类型的值执行相同的代码;后者只对有限数量的类型有效,而且对不同类型的值可能要执行不同的代码。

通用的多态又分为参数多态(parametric)和包含多态(inclusion);特定的多态分为过载多

态(overloading)和强制多态(coercion)。具体见下图:


<center><img http://blog.csdn.net/images/blog_csdn_net/upwaker/45928/o_z1.jpg

2.1参数多态

概念:采用参数化模板,通过给出不同的类型参数,使得一个结构有多种类型。

例如:Ada中的generic(类属 )。

见下例:


http://blog.csdn.net/images/blog_csdn_net/upwaker/45928/o_z2.jpg

http://blog.csdn.net/images/blog_csdn_net/upwaker/45928/o_z3.jpg

分析:这两个packages的:

·应用内涵一致:提供的都是堆栈抽象操作。

·实现结构相似:采用同类数据结构,实现代码相同。

·元素的类型不同,一些用常量表示的细节不同。

对比:函数是相似的语句序列的一种涵义明确的抽象,用函数中的语句表示相同的部分,用形参指明不同的部分,用实参体现不同的部分。但是,函数的参数只能是数据,不能是类型。

类属在一个抽象结构中允许以参量形式来表示可变的类型﹑函数﹑常数﹑数据值,在编译时

(静态)进行实例化,结果是一个具体的结构(类型﹑函数等)。而且类型的实例化可以静态进

行,也可以动态进行,但结果都是一个值。

Ada中的generic结构体现的多态性例子如下:


http://blog.csdn.net/images/blog_csdn_net/upwaker/45928/o_z4.jpg

generic结构调用的时候的情况:


http://blog.csdn.net/images/blog_csdn_net/upwaker/45928/o_z5.jpg

可见:

·对实参所取得类型不加限制。

·对不同的实参执行的是相同的代码。

因而构成了多态。

2.2 包含多态

概念:同样的操作可用于一个类型及其子类型。(注意是子类型,不是子类。)包含多态

一般需要进行运行时的类型检查。如Pascal中的子界。


http://blog.csdn.net/images/blog_csdn_net/upwaker/45928/o_z6.jpg

几点需要注意的地方:

1.    包含多态的操作存在着逆单调(Anti-mornotonic)。即一个类型t上的操作,当其定义域缩小成t的一个子类型时,其值域应不小于t.

2.3 过载多态

概念:同一个名(操作符﹑函数名)在不同的上下文中有不同的类型。程序设计语言中基本类型的大多数操作符都是过载多态的。如c语言中的

==  :  int * int -> int

==  :  double*double->int

==  :  char*char->int

有一些程序设计语言允许用户自定义过载多态的操作符。如c++语言中的:

bool  operator == (Complex1 c1,  Complex c2);

bool  operator ==(Address a1,  Address a2);

过载多态的操作符或函数名,他所对应的通常是不同的实现。


http://blog.csdn.net/images/blog_csdn_net/upwaker/45928/o_z7.jpg

2.4 强制多态

概念:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。程序设计语言中基本类型的大多数操作符,在发生不同类型的数据进行混合运算时,

编译程序一般都会进行强制多态。程序员也可以显示地进行强制多态的操作(Casting)。

例如:


http://blog.csdn.net/images/blog_csdn_net/upwaker/45928/o_z8.jpg

要注意的是并不是任意两个类型之间都可以进行强制多态。在不同类型之间实现强制多态,通常需要执行不同的转换操作。强制多态的原则是:将值集较小(即占用存储空间较小)的类型,变换成值集包含了前者(即占用存储空间较大)的类型,反之,应当注意可能发生的对值的损伤(特别是在使用Casting时)。

有时,强制多态与过载多态是混合出现的。例如,对于表达式1+2; 1.0+2; 1+2.0; 1.0+2.0;

中出现的多态,就会有多种解释:

·操作符+有四种过载多态;

·操作符+只有一种:double * double -> double, 要将参与运算的整数强制变换成浮点数;

·操作符+有两种过载多态:int * int -> int 和 double * double -> double,要将混合运算中的整数强制变换成浮点数。

其他类型的多态

现在的多数文献中都认为,在面向对象程序设计语言中还存在着两种多态:

·在有继承关系的类之间存在的多态(但不能完全等同于包含多态);

·通过动态绑定机制,在运行时才确定接受消息的对象类型(如c++语言中的虚拟函数)。

全文完

张秀君 整理

2004. 9 .17

面向对象技术第一讲 多态性(原创)相关推荐

  1. 面向对象技术第一讲 多态性

    面向对象技术第一讲  多态性 一﹑什么是多态?为什么要支持多态? 多态是一种普遍存在的现象,如water的三种形态:冰﹑水﹑汽,又如算术运算1+1, 1+0.5, 1/2+0.5等. 多态性用一句经典 ...

  2. 容器技术第一讲:容器入门篇

    女主宣言 容器作为Paas的一种体现,越来越受到广大程序员的喜爱.本文作为容器的入门篇,对Docker的原理和主要技术进行了初步的介绍. PS:丰富的一线技术.多元化的表现形式,尽在"HUL ...

  3. 编程学习笔记(第一篇)面向对象技术高级课程:绪论-软件开发方法的演化与最新趋势(1)...

    软件工程的课程,对于从事大中型的软件开发是至关重要的一门课程. <面向对象技术高级课程>深入.系统.完整地讲解当今主流的面向对象软件开发方法的分析.设计.实现及重构方法,深入讲解UML语言 ...

  4. 面向对象程序设计概述(金老师第一讲)

    EnvironmentSetUp windows的版本(内存和硬盘)+安装断点续传软件( 飞讯,可以暂停后继续下载)+虚拟光驱软件(DAEMON Tools读取下载的.ISO 光盘映像文件) CSha ...

  5. 青岛科技大学|物联网工程|物联网定位技术(第一讲)|6.7

    目录 物联网定位技术(第一讲) 1. 什么是物联网定位技术? 2. 物联网定位技术主要有哪些? 3. 简述卫星定位系统的发展历史以及GPS的发展概况? (1)卫星定位的由来和发展 (2)GPS的发展概 ...

  6. C#精髓【月儿原创】第一讲 使用垃圾回收器

    说明:准备出一个系列,所谓精髓讲C#语言要点.这个系列没有先后顺序,不过尽量做到精.可能会不断增删整理,本系列最原始出处是csdn博客,谢谢关注. C#精髓 第一讲 使用垃圾回收器 作者:清清月儿 主 ...

  7. PHP面向对象技术(全面讲解)(高洛峰)

    PHP面向对象技术(全面讲解)(高洛峰) 内容来自:http://blog.csdn.net/dengzonghuan/article/details/4055666 本部分一共包括以下一些技术点: ...

  8. UML2面向对象分析与设计 -- 面向对象思维(概念、面向对象技术的发展历史、对象和类、面向对象技术的相关原则:抽象 封装 分解 泛化 多态 分层 复用)

    文章目录 1. UML2面向对象分析与设计 学习目标 2. 面向对象思维 2.1 学习目标 2.2 什么是面向对象 2.3 面向对象技术的发展历史 2.4 面向对象技术的优势 2.4.1 便于沟通:在 ...

  9. 面向对象技术在开放式数控中的应用

    数控(NC,Numerical Control)是一种用数字化的信息(数字.字母和符号)对某一工作过程(如加工.测量.装配等)进行可编程的自动控制技术. 数控系统(Numerical Control ...

最新文章

  1. 你还不会创建jQuery插件 ?
  2. python hex 补0_Python保留前导零的二进制到十六进制转换
  3. request设置请求头_收藏 Scrapy框架各组件详细设置
  4. Django 多数据库联用(看着不错还有源码可以下载)
  5. Earliest PEP Algorithm Principles
  6. 将Java向前推进? 一个定义。 一年回顾。
  7. linux系统管理与服务器配置高志君_如何在 Linux 上安装、配置 NTP 服务器和客户端?...
  8. 【Java】文件操作
  9. mysql安装及一些注意点
  10. Java main 方法详解
  11. 设置域用户登录主目录
  12. JavaWeb——IOC
  13. css表格强制不换行符,css控制table单元格强制换行与强制不换行
  14. JAVA Map集合类简介
  15. 学计算机专科好还是牙医好,孩子明年高考,牙科、计算机两个专业,怎么选?...
  16. java测量麦克风音量_Android 获取麦克风的音量(分贝)
  17. python使用selenium大麦网抢票
  18. Python批量化实现SAR图像的海陆分割
  19. IP属地靠谱吗?或是一把双刃剑
  20. 将两个字符串连接起来,不要用strcat函数。

热门文章

  1. 日常运维之AWS 导入pfx/p12证书
  2. 什么是缓存?Mybaits一级缓存和二级缓存分别是什么,区别是什么?缓存和缓冲区的区别是什么?
  3. 是你想要的K8S--五种控制器类型解析(Deployment 、StatefulSet 、DaemonSet 、Job 、CronJob)
  4. Linux友好度太低?试试Clion远程开发|ssh连接远程主机
  5. java mkfifo_pipe/popen/mkfifo
  6. gazebo中导入sdf文件
  7. 【神回复】程序员30多岁还在投简历找工作,怎么看?
  8. [转载]电机 螺旋桨 电池之间的关系(普及版)
  9. 萌宠萌萌宝贝,绝代双萌,可爱死你呀
  10. Linux-ssh: connect to host 192.168.1.161 port 22: Connection refused