分享
 
 
 

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

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

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

多态是一种普遍存在的现象,如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 src=http://blog.csdn.net/images/blog_csdn_net/upwaker/45928/o_z1.jpg border=0><\center>

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有