一文详解COM接口

如果你了解c#或者java语言,接口就会是一个非常熟悉的概念。接口是一个对象上一组操作的集合,不涉及任何实现的细节,接口标志着方法和实现的分离。计算机中这种现象叫做解耦(decoupled)。
在c++中,最接近于接口概念的就是纯虚类(purevirtualclass)。纯虚类就是一个仅仅包含纯虚函数的类,除了纯虚函数不含有任何其它的成员变量或者函数,如:
这个例子来源于一些用来绘图的库中的对象。idrawable接口定义了绘图中常用的操作,任何支持绘图功能的对象都必须支持该接口。(惯例,接口名称的首字母为“i”),idrawable接口目前只定义了一个操作:draw。
所有的接口都是抽象的,代码中不能直接创建一个idrawable接口的实例对象(c++语法规则不支持纯虚函数对象的创建)。例如,下面的代码是无法编译通过的:
相反的,图形库都会提供一些对象来实现idrawable所定义的接口。例如,可以实现一个叫做shape的类或者一个叫做bitmap的类,c++中使用继承实现这种关系:
shape和bitmap类定义了两种不同的对象,二者都支持绘图功能。每个类都继承自idrawable接口,而对于draw方法绘制的具体实现细节可以各自不同。
如果程序中使用二者进行绘制,可以使用idrawable的指针对象来操纵它们,而不是直接使用shape和bitmap对象的指针。
这有一个循环遍历idrawable接口指针的列子,在这个数组中,每项成员可能是shape对象,也可能是bitmap对象,更可能是一些支持idrawable接口的其他对象,代码中无需这些不同类型的实现细节,只需要调用它们都支持的共有接口idrawable就可以绘制我们想要的图像。
com组件的一个关键点就是调用者永远不需要知道派生类的具体实现细节。换句话说,在你的代码中一般不会声明shape或者bitmap类型的变量。所有的操作都是通过它们共有的接口idrawable来完成。用这种方式,com组件可以做到接口和实现的完全分离。
你可以随时改变shape或者bitmap对象的绘制方法,例如修复一个bug,或者增加一些新的能力,对于调用者来说是透明的,调用者的代码是无需任何修改的。
在c++中,接口使用类或者结构体来实现。
文章中的代码案例只是用来演示说明问题,真正的com接口定义显然不会这样简单。一般一个com接口的定义使用一种叫做interfacedefinitionlanguage(idl)——接口定义语言的东西。这个idl文件将描述具体的接口行为,然后用idl文件编译器处理,生成一组c++头文件。
当你在使用com组件的时候,一定要记住接口不是对象。它们是一组必须实现的方法集合。一些对象可以实现一样的接口,例如代码中的shape对象和bitmap对象。另外一个对象可以实现几个接口,例如,一个图形库可能定义一个名字叫做iserializable的接口对象,它用来保存和加载图形对象数据(图形的序列化)。现在考虑下面的代码:
在例子中,bitmap类实现了iserializable接口,程序可以使用该接口保存和加载bitmap对象。然而shape类没有实现这个接口,所以它不支持这个功能。下面是例子中的继承关系:
上面的文字只是简单的介绍com组件的一些概念,目前我们还没有看见过一个真正的com组件,接下来的内容从每个com应用都必须做的一件事开始——com库初始化。


消防设备动力监控系统的特点是什么
SRS-XB31和JBLPulse3哪个好
谷歌新专利 Android电脑或将成为现实
苹果13pro颜色分享 苹果13pro新增了哪些配色
数字孪生智慧选煤厂:数据监控赋能矿山高效生产
一文详解COM接口
如何设计高效PL和PS数据交互通路的AXI接口
华为荣耀Magic:黑科技未来手机的秘密 看看史上最强拆解
华为5G端到端全面领先业界对手多款核芯能力亮相河南
视频监控领域的大数据应用主要体现在以下两个方面
华为P10热销势不可挡!顾客排队抢购很疯狂
孤独青年 你可能需要一个话唠机器人朋友
国内EDA产业的新机遇、发展特点与方向分析
简单介绍超声波清洗机的原理及使用步骤
锂离子电池命名规则是什么?
哪吒汽车将搭载宁德时代“神行”4C超充电池
采用计算机控制器实现汽轮机数字电液控制系统的设计
HC 2022 | 智能云网分论坛发言嘉宾金句集锦
智能手机RF PCB上支持多少无线通信系统?
为什么说温枪的BOM成本不足50元