设为首页
收藏本站
开启辅助访问
切换到窄版
登录
立即注册
中问网首页
我的收藏
站长博客
搜索
搜索
本版
帖子
用户
第一问答网
»
论坛
›
中问网
›
问答
›
多态性如何提高程序的可扩展性?
返回列表
发新帖
多态性如何提高程序的可扩展性?
[复制链接]
11
|
0
|
2007-7-4 12:33:04
|
显示全部楼层
|
阅读模式
多态多态(polymorphism)在一些编程教材中被弄得很神秘,而在另外一些教程中则被忽略,其实它不过是C++语言所支持的一个简单而有用的概念。按照C++标准所言,“多态类型”旧时代由虚函数的类类型(class type)。从设计的角度来看,“多态对象”就是一个具有不止一种类型的对象,而“多态基类”则是一个为满足多态对象的使用需求而设计的基类。 让我们看一个金融期权的类型AmOption,如图1所示。 +-------------------------------------------------------+ |
Deal
iceable
| |
^
^
| |
|
|
| |
+------------------------------+
| |
|
Option
|
| |
+------------------------------+
|
|
^
^
| |
|
|
| |
AmOption
EurOption
| +------------------------------------------------------------------+
图1 在一个金融期权层次结构中多态的作用。AmOption有4种类型AmOption对象同时具有四种类型:AmOption\Option\Deal\Priceable。由于一个类型是一组操作,因此,AmOption对象通过其4个接口中的任何一个进行操纵。这意味着一个AmOption对象可以被针对Deal\Priceable\Option接口编写的代码所操纵,从而允许AmOption的实现利用或复用所有那些代码。对于AmOption这样的多态类型,从基类继承的最重要的东西就是他的接口,而不是他的实现。事实上,一个基类仅仅由接口组成不但常见,而且通常正是我们所希望的。当然,这里还有一个需要注意的地方。如果让这种优势能够发挥出来,一个良好设计的多态类对于他的每个基类而言必须是可替换的。换句话说,如果针对Option接口编写的通用代码接受的是一个AmOption对象,那么该对象的行为最好就像一个Option对象。 这并不是说AmOption对象应该和Option对象的行为完全一致(Option可能有很多纯虚函数)。实际上一个多态基类想象成一份合同更好理解一些。这个基类对其借口的用户作了某些承诺,这些承诺包括郑重的语法承诺,即约定的成员函数可以通过一些特定类型的实参进行调用,以及不容易验证的语义上的承诺,即当一个特定的成员函数被调用时将会发生什么实际情况。像AmOption和EurOption这样的具体派生类被称为“转包者”,他们实现Option与其客户签订的合同,如图2所示。
+--------------------------------++--------------+
|class Option
||针对Option
|
|{
||接口编写的| |
virtual price()=0;
||代码
|
|
update();
|+--------------+
|};
|
|---------------------------------+
|class AmOption:public Option
|
|{
|
|
virtual price();
|
|};
|
|----------------------------------+
|class EurOption:public Option
|
|{
|
|
virtual price();
|
|};
|
+----------------------------------------+
图2,一个多态的承包者及其“转包者”
举了例子,如果Option具有一个纯虚成员函数Price,其作用是给出Option的当前值,那么AmOption和EurOption都必须实现这个函数。我们显然不会为这两种类型的Option实现完全一致的行为,但他们都应该计算并返回一个价格(price),而不应该去拨打一个电话或者去玩游戏:)另一方面,如果我们要去访问同一个对象的两种不同接口的price函数,那么我们应该得到相同的结果。就本质而言,每一个调用都应该绑定到同一个函数:
AmOption *d=new AmOption;
Option *b=d;
d->price();
b->price();//其实就是说虚函数实际上还是调用的AmOption的。
这是有意义的。假如我问你“那个美国期权的当前值是什么?”,我期望得到与下面简短提问方式相同的答案:“那个期权的当前值是什么?” 当然,同样的推理也适用于对象的非虚函数: b->update(); d->update(); //都是调用的b里面的update正是基于提供的合同允许针对基类借口编写的“多态”代码对特定的合同起作用,同时有助于对派生类的存在保持“健康的不知情”。换句话说,多态代码可能正在操作AmOption和EerOption对象,但除非特别关心他们到底是什么对象,否则均被视为Option对象。各种各样“具体的”Option类型可以被添加或删除而不会影响到只关心基类Option的通用代码。比方说,如果某一个地方出现一个AsianOption对象,那么只知道Option的多态代码也能操作它,这全托"对具体类型不知情"的福,如果以后这个对象消失了,也犯不着去挂念它。 出于同样的原因,像AmOption和EurOption这样具体的期权类型只需要知道积累就可以了,改变通用代码对他们毫无影响。原则上,基类可以不知道出自身以外的任何事物。从实践的角度来看,对其接口的设计要考虑与其用户的需求,并且应该以这样的方式进行设计:派生类很容易的推知并实现其合同。然而,基类应该对其派生类的具体细节全然不知,因为知道这些会不可避免的致使类层次结构上添加或删除派生类变得困难。 和生活中一样,在面向对象设计中,“不知情”或“忽略”也是天赐之福。
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
千问
主题
0
回帖
4882万
积分
论坛元老
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
积分
48824836
加好友
发消息
回复楼主
返回列表
问答
热门排行
1
银行ITSM市场版图
2
了解ORACLE ODI的请帮个忙
3
电子病历系统架构师
4
用预测分析和链接分析打击欺诈
5
普华永道 java /net /测试软件工程师
6
学习SAP
7
深圳 avnet java软件工程师
8
麻烦帮我看下这两条sql查出来的结果为什么不一样?
9
在10G中怎么存储阿拉语?
10
solaris系统时间
11
最新SAP support职位
12
【天津】 DBA(oracle 开发) 待遇优厚 500强美企
13
OUT Sys_Refcursor 能否直接写在块里
14
mysql有没有交换分区的功能呢?
15
IBM上海招聘
16
eBay上海招聘信息
17
老胡个人私房钱,发精华帖有实物奖
18
java Web资深后台开发高级工程师
19
Assign Item To Org API
20
【大连】Oracle 开发(知名美资IT公司)
21
solaris下用户无法切换用户su: no shell
22
SO中的首个日期和请求交货日期的区别
23
请问,oracle访问lotus notes的问题
24
深圳 北京 招聘AS400开发人员
25
MR8M如何实现部分反冲?
26
请教SQL性能调优问题,谢谢
27
浙江移动舟山分公司正式工招聘!!
28
91ABAP—abap公开课试听
29
广州某外资甲方公司招聘MM BW BASIS顾问
30
广州某外资甲方公司招聘java工程师
31
招聘SAP HR高级顾问——上海
32
急招对日Java、.NET ,可以去日本出差,base上海
33
sqlldr 多次append数据时,产生高水位,求指教!
34
北京朝阳SK大厦招资深C#-英文好
35
打听一下国内央企都用哪家的CRM产品啊!
36
smartform 打印的时候 中间空页
37
【知名ERP厂商】招聘“产品顾问(偏系统分析)”
38
急猎:金融测试总监(深圳)
39
HP DP备份软件中如何查看备份脚本?
40
招聘
41
【上海】招聘SAP FICO和P2P,另有JAVA TL职位
42
对join查询语句的困惑
43
国内金融IC卡相关公司
44
增量备份太慢,怎么办?
45
SAP中国招咨询顾问
46
如何保留列中非0之后的字符?
47
远程建立数据库实例
48
IT RECRUIMENT CONSULTANT ( FSI background is an advantage)
49
ALTIBASE报错如何修改
50
编程是围城么?
51
公司oracle现状与优化求教
52
12 Steps to Useful Software Metrics
53
招聘oracleEBS开发
54
日期相减咨询
55
The Nature of Exploratory Testing
56
Exploratory Testing Explained
57
上海急招对日JAVA/.NET,Java1年以上,NET3年以上。急急急
58
abap 高级 注释(有进来看,就留言,大家分享经验呵呵)
59
物化视图和物理表的查询效率
60
【SAP中国】急招SAP资深财务顾问--20151019更新
61
外资500强公司,base南京,ABAP,1~5年,英文一般就行!!
62
高级java开发工程师--天津
63
[上海]游戏/软件/咨询/IT List Cissy@20120903
64
日立咨询中国研发中心 招聘Oracle eBS DBA
65
紧急职位!紧急!oracle DIS 顾问,准确、紧急
66
GoldenGate 同步数据报错OGG-01960
67
如何写shell获取命令执行结果的一部分
68
视图刷新组有时候刷新速度不正常
69
Move Order
70
南京零售项目急聘1-5年ABAP顾问
71
上海Java职位 from Cissy@20120903
72
求教,tnsping本机延迟非常大,求解决思路
73
郁闷!作为HR的我被候选人面试了一回……
74
阿里集团分公司招mysql dba
75
大连 上海紧急测试职位,英语好!!
76
上海急招.NET5年经验,英文流利
77
###给经验少的人的锻炼机会%%%oracle EBS
78
大型咨询公司#上海###ORACLE _DIS 急急急急!!!
79
ABAP--1-3年的最佳选择
80
【苏州招聘】盟拓软件诚聘:System Admin系统管理员///、OPS Engineer生产管理工程/
81
SAP Oracle DB 11.2.0.3
82
【上海/苏州急聘】盟拓软件诚聘Sharepoint Engineer,紧急~~!
83
求解决SUSE 11下安装Oracle 11问题
84
【苏州招聘】盟拓软件诚聘System Admin系统管理员///OPS Engineer生产管理工程师,急
85
求版主证实下ITPUB是否有此培训?
86
在线重定义Online Redefinition的疑问
87
webutil_core.log()方法打出的log如何查看
88
ALV LAYOUT BOX_FIELDNAME与排序问题
89
VB.NET developer-Shanghai
90
SAP ABAP Developer-nanjing
91
JAVA-TL /AM -Banking
92
《深入理解Oracle DBA入门、进阶与诊断案例》中的疑问?
93
BI-TL-Shanghai
94
oracle日期问题
95
JBoss Developer Framework: A Documentation Hub For JBoss Technologies
96
一不留神,报错了,这是为什么呀,日期不对吗
97
申请账号解禁!!!
98
层层SELECT 写的查询 如何在PL/SQL DEV里 UPDATE 数据
99
上海甲方急聘:Oracle EBS TECH/SCM 2~8年 有工厂经验 没有英语要求 男
100
请问有计算项目库(project stock)库存的周转率(Turnover)的SAP标准T-Code吗?