C#讲义-补充从C++到COM选编.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
*-54 圆满解决链接器的兼容性问题 通过这种方式我们可以安全地在C++环境中暴露DLL中的类,而在另一个C++环境中访问它。 接口类作为客户与实现类的屏蔽. 这种方式是COM中建立与编译器厂商无关的可重用组件的技术基础。 *-54 5 对象的扩展性 5.1 功能扩展的需求 至此客户可以动态地加载二进制组件,在接口类定义不变的情况下,实现者可以自由地对实现方案进行升级,客户无需重新编译。至此已经解决了前面所面临的 链接器兼容性问题 内存管理问题 类库的更新问题 无缝更新的条件:对象的接口不能变化。因为客户在编译过程中需要接口的精确定义,对接口的任何变化都会导致客户的重新编译。而且对接口的任何改编都会破坏对象的封装性要求。 如果擅自更改已经发布的接口类的话…… *-54 初始IFastString接口: class IFastString{ public: virtual void __stdcall Delete(void)=0; virtual int __stdcall Length(void) =0; virtual int __stdcall Find( char*psz)=0; }; 更改后的接口: class IFastString{ public: virtual void __stdcall Delete(void)=0; virtual int __stdcall Length(void) =0; virtual int __stdcall Find( char*psz)=0; virtual int __stdcall FindN( char*psz,int n)=0; //新增加的虚函数。 }; 老客户得到了包含FindN表项的新对象时,仍然能正常工作,然而,新客户如果碰巧使用了老对象,当客户针对基于老接口定义编译得到的对象调用FindN时,程序崩溃了。 原有的接口功能函数亦不能有任何的改动,否则也会带来不可预知的错误。 *-54 因此,接口定义一旦公开,是不能更改的。 但是, 对功能的需求却是无限的, 功能扩展性解决方案:允许实现类暴露多个接口。新增加的功能在新的接口中。 这有两种途径: 1。设计一个接口使得它继承自另一个相关的接口。 2。让实现类继承多个不相关的接口。 (实际上,还有很多种方法.) *-54 对原接口进行扩展,生成新的接口.比如使用从原接口继承的方式 class IFastString2:public IFastString { public: virtual int __stdcall FindN( char*psz,int n)=0; }; 新的实现类的定义: (派生自新接口) class FastString : public IFastString2 { int m_cch; char*m_psz; public: FastString( char* psz); ~FastString(); void __stdcall Delete(void); // IFastString的方法 int __stdcall Length(void); int __stdcall Find( char*psz); int __stdcall FindN( char*psz,int n); // IFastString2的方法,实现类提供它的实现。 其他的方法同前。 }; 5.2 方法一:扩展接口 *-54 客户在运行时询问对象,以确认对象是否支持新的接口。这里将使用dynamic_cast 运算符。 int Find10thBob(IFastString *pfs) { IFastString2 *pfs2=dynamic_castIFastString2 *(pfs); if(pfs2) return pfs2-FindN(Bob,10); //如果实现了IFastString2 接口. 新实现类(如果使用的是新的服务器) else error(can not find 10th occurrence of Bob); //如果实现了IFastString2 接口. 老实现类(如果使用的是老的服务器) } 老客户不会试图调用FindN。 新客户调用FindN时碰到了老对象可以平稳地处理。 新老客户可以共存。 这种平滑的由用户决定的downcast能力,可以使得系统功能不断地扩展、升级。 *-54 5.3 方法二:多接口 前一节新接口扩展的功能与原功能有一定的逻辑关系. 当对象需要提供与原功能不相关的新功能时,比如说提供永久性支

文档评论(0)

挑战不可能 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档