com口是什么接口(com口是干嘛的)
com口是什么接口(com口是干嘛的)
如果你了解 C# 或者 Java 语言,接口就会是一个非常熟悉的概念。接口是一个对象上一组操作的集合,不涉及任何实现的细节,接口标志着方法和实现的分离。计算机中这种现象叫做解耦(decoupled)。
在 C++ 中,最接近于接口概念的就是纯虚类(pure virtual class)。纯虚类就是一个仅仅包含纯虚函数的类,除了纯虚函数不含有任何其它的成员变量或者函数,如:
// The following is not actual COM. // Pseudo-C++: interface IDrawable { void Draw(); };
这个例子来源于一些用来绘图的库中的对象。IDrawable 接口定义了绘图中常用的操作,任何支持绘图功能的对象都必须支持该接口。(惯例,接口名称的首字母为 “I”),IDrawable 接口目前只定义了一个操作:Draw。
所有的接口都是抽象的,代码中不能直接创建一个 IDrawable 接口的实例对象( C++ 语法规则不支持纯虚函数对象的创建)。例如,下面的代码是无法编译通过的:
IDrawable draw; draw.Draw();
相反的,图形库都会提供一些对象来实现 IDrawable 所定义的接口。例如,可以实现一个叫做 Shape 的类或者一个叫做 Bitmap 的类,C++ 中使用继承实现这种关系:
class Shape : public IDrawable { public: virtual void Draw();// Override Draw and provide implementation. }; class Bitmap : public IDrawable { public: virtual void Draw();// Override Draw and provide implementation. };
Shape 和 Bitmap 类定义了两种不同的对象,二者都支持绘图功能。每个类都继承自 IDrawable 接口,而对于 Draw 方法绘制的具体实现细节可以各自不同。
如果程序中使用二者进行绘制,可以使用 IDrawable 的指针对象来操纵它们,而不是直接使用 Shape 和 Bitmap 对象的指针。
IDrawable *pDrawable = CreateTriangleShape(); if (pDrawable) { pDrawable->Draw(); }
这有一个循环遍历 IDrawable 接口指针的列子,在这个数组中,每项成员可能是 Shape 对象,也可能是 Bitmap 对象,更可能是一些支持 IDrawable 接口的其他对象,代码中无需这些不同类型的实现细节,只需要调用它们都支持的共有接口 IDrawable 就可以绘制我们想要的图像。
void DrawSomeShapes(IDrawable **drawableArray, size_t count) { for (size_t i = 0; i < count; i++) { drawableArray[i]->Draw(); } }
COM 组件 的一个关键点就是调用者永远不需要知道派生类的具体实现细节。换句话说,在你的代码中一般不会声明 Shape 或者 Bitmap 类型的变量。所有的操作都是通过它们共有的接口 IDrawable 来完成。用这种方式,COM 组件可以做到接口和实现的完全分离。
你可以随时改变 Shape 或者 Bitmap 对象的绘制方法,例如修复一个 bug,或者增加一些新的能力,对于调用者来说是透明的,调用者的代码是无需任何修改的。
在 C++ 中,接口使用类或者结构体来实现。
文章中的代码案例只是用来演示说明问题,真正的 COM 接口 定义显然不会这样简单。一般一个 COM 接口的定义使用一种叫做 Interface Definition Language(IDL)—— 接口定义语言的东西。这个 IDL 文件将描述具体的接口行为,然后用 IDL 文件编译器处理,生成一组 C++ 头文件。
class IDrawable { public: virtual void Draw() = 0; };
当你在使用 COM 组件的时候,一定要记住接口不是对象。它们是一组必须实现的方法集合。一些对象可以实现一样的接口,例如代码中的 Shape 对象和 Bitmap 对象。另外一个对象可以实现几个接口,例如,一个图形库可能定义一个名字叫做 ISerializable 的接口对象,它用来保存和加载图形对象数据(图形的序列化)。现在考虑下面的代码:
// An interface for serialization. class ISerializable { public: virtual void Load(PCWSTR filename) = 0;// Load from file. virtual void Save(PCWSTR filename) = 0;// Save to file. }; // Declarations of drawable object types. class Shape : public IDrawable { ... }; class Bitmap : public IDrawable, public ISerializable { ... };
在例子中,Bitmap 类实现了 ISerializable 接口,程序可以使用该接口保存和加载 Bitmap 对象。然而 Shape 类没有实现这个接口,所以它不支持这个功能。下面是例子中的继承关系:
上面的文字只是简单的介绍 COM 组件 的一些概念,目前我们还没有看见过一个真正的 COM 组件,接下来的内容从每个 COM 应用都必须做的一件事开始 —— COM 库初始化。
-
- 粽子加热是什么(粽子加热是蒸还是煮)
-
2024-01-19 08:36:58
-
- 白百何 王珞丹(白百何王珞丹蒋梦婕)
-
2024-01-19 08:34:52
-
- 樱桃小嘴嘟嘟的脸是什么歌(樱桃小嘴嘟嘟的脸 是什么歌)
-
2024-01-19 08:32:46
-
- 泰拉瑞亚猩红之地(泰拉瑞亚猩红之地怎么净化)
-
2024-01-19 08:30:40
-
- 高尔基打一字(高尔基打一字为什么是尚)
-
2024-01-18 21:29:07
-
- 穿心莲种植(穿心莲种植与管理)
-
2024-01-18 21:27:02
-
- 万圣节的由来和习俗(万圣节旳由来)
-
2024-01-18 21:24:57
-
- 今年黄梅天什么时候(今年黄梅天什么时候开始出梅)
-
2024-01-18 21:22:52
-
- 生组词(语文一年级下册各单元词语表、生字组词汇总))
-
2024-01-18 21:20:47
-
- 国家秘密标志形式(【关注】保密常识必知必读)
-
2024-01-18 21:18:42
-
- 孙楠(离婚14年后,回头再看买红妹和孙楠二人境遇,夫妻差距一目了然)
-
2024-01-18 21:16:37
-
- 老电影(这26部老影片不但经典,也让每位主角演员家喻户晓、红极一时)
-
2024-01-18 21:14:32
-
- 中国护照(中国护照排名)
-
2024-01-18 21:12:27
-
- 写给老师的心里话(北京日报小苗)
-
2024-01-18 21:10:22
-
- 郑州营销策划公司(郑州营销公司哪家好?)
-
2024-01-18 16:52:36
-
- 黄晋琨(黄晋琨百科)
-
2024-01-18 16:50:30
-
- 红警攻略秘籍(红警攻略技巧集锦)
-
2024-01-18 16:48:24
-
- qq签到活动(里的签到是什么意思)
-
2024-01-18 16:46:18
-
- qq的聊天记录在哪里(聊天记录在什么地方)
-
2024-01-18 16:44:12
-
- 中国家纺品牌前十名(中国家纺一线品牌前十名)
-
2024-01-18 16:42:06