接口和接口实现

COM 从本质上区分接口定义及其实现。

接口实际上是一个协定,由一组相关的函数原型组成,其用法已确定,但实现不确定。 这些函数原型等效于 C++ 编程中的纯虚拟基类。 接口定义指定接口的成员函数、调用方法、返回类型、参数的数量和类型以及必须执行的操作。 没有与接口关联的实现。

接口实现是程序员提供的代码,用于执行接口定义中指定的操作。 编程人员可在基于对象的应用程序中使用的许多接口的实现包含在 COM 库中。 但是,程序员可以随意忽略这些实现并编写自己的实现。 创建某个对象的实例时,接口实现即与该对象相关联,并且提供该对象提供的服务。

例如,名为 IStack 的假设接口可以定义两个方法,即 Push 和 Pop,指定对 Pop 方法的连续调用按相反顺序返回以前传递给 Push 方法的值。 此接口定义不会指定如何在代码中实现函数。 在实现接口时,一位程序员可以将堆栈作为数组实现并实现 Push 和 Pop 方法,以便访问该数组,而另一个程序员可能使用链接列表并相应地实现方法。 无论 Push 和 Pop 方法的特定实现如何,指向 IStack 接口的指针的内存中表示形式,以及客户端使用该接口的方式完全由接口定义决定。

简单的对象仅支持单个接口。 更复杂的对象(如嵌入对象)通常支持多个接口。 客户端只能通过指向其中一个接口的指针访问 COM 对象,这反过来又允许客户端调用构成该接口的任何方法。 这些方法确定客户端如何使用对象的数据。

接口定义对象与其客户端之间的协定。 协定指定必须与每个接口关联的方法,以及每个方法必须采取的输入和输出行为。 协定通常不定义如何在接口中实现方法。 协定的另一个重要方面是,如果对象支持接口,则必须以某种方式支持该接口的所有方法。 并不是实现中的所有方法都需要执行某些操作。 如果对象不支持方法隐含的函数,则其实现可能是简单的返回,也可能是有意义的错误消息返回,但方法必须存在。

COM 对象和接口