com口是什么接口(com口是干嘛的)

如果你了解 C# 或者 Java 语言,接口就会是一个非常熟悉的概念。接口是一个对象上一组操作的集合,不涉及任何实现的细节,接口标志着方法和实现的分离。计算机中这种现象叫做解耦(decoupled)。

com口是什么接口(com口是干嘛的)

在 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 组件,接下来的内容从每个 COM 应用都必须做的一件事开始 —— COM 库初始化。

本文所有内容来自互联网,如有侵权/不实内容请联系我们删除,联系邮箱postusb@foxmail.com

发布者:缘分,转转请注明出处:https://www.bjxdyg.com/baike/258095.html

(0)
缘分缘分
上一篇 2023年 6月 13日 下午1:50
下一篇 2023年 6月 13日 下午2:19

相关推荐

  • 梦见男朋友很绝情的不要我了

    俗话说:“日有所思夜有所梦。” 白天会想到什么事情,晚上就会梦到什么事情,白天会想到谁,晚上这个人就会出现在梦里。 容易梦见的人,总是白天愿意提起的人。 可是有时候恰恰相反,有的人白天从未想过,可是晚上,还会梦到。 于是有人就纳闷,难道梦都是和自己的心灵相反的吗? 现在梦见的,曾经都很重要 去年回老家的时候,有一个邻居对我说: “从小和父亲相依为命,父亲已经…

    2023年 6月 30日
    11200
  • 菜单栏跑到右边去了(菜单栏跑到右边了怎么弄回来)

    运行就是电脑出现故障的时候,通过开始菜单运行中输入命令来解决故障修复电脑,比如计算器calc 直接ping自己网卡是否正常(本地网卡地址127.0.0.1)命令提示符cmd 注册表 组策略等等,好处就是比在桌面空白处新建快的多省事的多~ 下面的内容就是如何找回的步骤方法,希望能帮助有类似故障的朋友以及粉丝们~ 处理过程: 一:在任务栏(位置电脑桌面的下方开始…

    2023年 7月 18日
    14900
  • 微信原图怎么发(电脑微信原图怎么发)

    手机微信聊天中的照片,怎么发送才是原图? 手机微信聊天中的视频,怎么发送才是原画质? (方法:同下边,发送照片原图一致!) 引言: 我发送的照片或者图片, 朋友说:看不清!不清晰!放不大! 说我没有发送原图! 我从手机上看是非常清晰的啊! 哪里出错了呢? 微信聊天中的照片怎么发送才是原图 来,彬彬告诉您正确的方法! 第一步、打开微信: 选定我们要发送的对象(…

    2023年 5月 23日
    28900
  • 我向你奔赴而来(我向你奔赴而来唯美句子)

    近日,怀化市第二人民医院洪江医院来了一位特殊的老人,他在儿子的陪同下,自驾从广东省汕尾市来医院中医科住院治疗。 林爷爷,95岁高龄,祖籍广东,青年时代曾在洪江区工作,退休后长期在洪江定居。20多年前,林老因咳嗽胸闷,辗转多家医院就医,效果不理想。慕名找到洪江医院中医科主任黄建华,经过一段时间的中医药调理,病情很快康复。从此,几十年来,不管是冠心病心绞痛发作,…

    2023年 7月 1日
    18600
  • 我没忘记你忘记我连名字你都说错(我没忘记你忘记我连名字你都说错文案)

    #冬日生活打卡季# 圣诞大餐虽然与我们无缘,但圣诞午餐总是要吃得吧,很简单,炒菜花、红烧鱼。哈哈哈,菜花我炒,红烧鱼呀,海鲜之类水里游的食物烹饪归保镖承包。 我先炒菜花,等保镖烧鱼,很快就准备吃饭了。拿碗端鱼时问:“怎么加这么多老抽呢?” “手滑没控制好。” “拿来照照,可惜没有绿色。” “要葱花” 心想大葱不是被你煮在鱼里面了吗?难道阳台再剪两段放上去? …

    2023年 2月 26日
    38000

发表回复

登录后才能评论

联系邮箱

postusb@foxmail.com

邮箱咨询: QQ交谈

邮箱:postusb@foxmail.com

工作时间:周一至周五,9:30-18:30,节假日休息