接口与对象.pptVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
接口与对象

COM接口与对象 潘爱民 北京大学计算机研究所 2003-9-19 /CompCourse2003/ 内容 组件的接口 COM接口 COM IDL COM对象 从历史看COM COM产生的背景 93年因为OLE 2的需要而产生 OLE 1的缺陷 COM又从OLE中脱颖而出 COM的优势不限于OLE COM成为Microsoft跟上Internet的一项重要基础技术 今天的Windows平台上,COM无处不在 COM和.NET COM基础——三个概念 COM组件 组件:可独立发布的二进制组件 在Windows平台上为DLL或者EXE COM对象 通过COM接口提供服务 符合OO中对象的基本概念 COM接口 客户与对象之间的协议,对象实现COM接口,客户使用COM接口 如何设计? COM组件 为方便起见,只讨论Windows平台上DLL类型的组件 COM对象 如何标识一个对象?对象以什么形式存在?客户如何创建对象? 对象如何暴露接口?一个或是多个? COM接口 要求:跨编译器、跨语言、跨平台 设计COM接口——从C++入手 C++类:接口与实现的分离 接口:类的public部分 设计COM接口——从C++入手(续) C++类的实现 C++类的链接(linking) 静态链接 许多类库的做法 编译时刻的链接 静态链接的缺点 代码重复:多个程序各有自己的代码,需要更多的内存 客户程序占据更多的外存空间 库代码更新需要重新编译所有的客户程序 C++类的链接linking(续) 动态链接 运行时刻的链接 动态链接形式 编译时刻通过引入库 运行时刻完全动态 Dll Hell C++接口如何走向COM接口 动态链接符合COM的需要 C++中类形式的接口存在的问题 客户看到了什么? 若用Visual C++ 5.0/6.0编译器 客户眼中的C++类(续) 如果是Borland C++编译器(4.02) 命名冲突解决方案1 模块定义文件(.def)中给出别名 命名冲突解决方案2 模块定义文件(.def)中给出序号别名 命名冲突解决方案3 使用C++类的vtable C++类的vtable不随编译器而变化 vtable包含了各个函数的原型,顺序固定,每个函数的参数、返回类型等,函数名并不重要 vtable要求这些接口函数必须是虚函数 客户如何得到vtable? 仍然需要有一种办法来创建C++类 new/delete?需要对象的二进制结构——问题2 C++对象的二进制结构 C++的封装是语法上的封装,而不是二进制封装 new/delete是编译器相关的 编译器不仅要知道public信息,也要知道private信息 C++对象的二进制结构是编译器相关的 即使客户看到的C++类公开接口没有变化,但是C++类的实现改变了,仍然会打破客户与对象之间的连接 C++对象与客户之间的连接问题 客户与C++对象之间的连接点越小越好 只有接口部分必要的信息才放入接口 把C++类的实现细节与接口分开 提取出针对所有编译器都不变的因素作为客户与对象共享的接口信息 方案1:句柄 句柄方案 方案1:句柄 纯虚基类方案 前提条件: 在给定平台上所有的编译器都会产生同样的二进制结构 纯虚函数在单继承情况下满足这一条件 纯虚基类只包含虚函数,限定每个虚函数的调用习惯 对于跨平台的情形,我们肯定要通过中间层,所以暂时可以不考虑 虚函数的继承布局情况 class B : pulic A { private : int value1; public: virtual void Func1(void) virtual void Func2(void) }; 纯虚基类方案例子 解决了名字冲突 解决了C++类的二进制布局不兼容问题 客户只看到vtable,没有看到其他的实现细节 保证不同语言编写的程序可以互操作 在不改变接口的情况下,可以单独升级客户或者对象 纯虚接口的使用? 假如有一个C++对象实现了IString 如何创建对象? 不能使用new DLL的唯一接口是引出函数 可行方案:单独提供一个引出函数供客户调用 通过引出函数创建对象 创建对象 如何删除对象? 删除对象发生在客户与对象建立联系之后,所以比较好办 但是不能用delete 可以让对象自己把自己删除 在IString中增加一个方法 删除对象自身 小结 我们已经建立起对象与客户之间的基本通信方式 更高的要求: 接口的升级 增加新的功能 生命周期管理 什么时候该删除对象 多个客户共享同一个对象,如何管理? 对象的进化 在原有接口的基础上增加新的功能,例如 对象的进化(续) 接口的进化 对象实现多个接口 对象实现多个接口(续一) 对象实现多个接口(续二

文档评论(0)

1234554321 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档