Windows编程之COM组件
什么是COM接⼝?
COM即Component Object Model,到底是⽤来⼲啥的呢?如果你了解Java或者C#,你应该会很了解interface。在C++中,最接近接⼝概念的应该是虚类了,所谓虚类,就是只包含虚函数的类。下⾯是接⼝的例⼦
// The following is not actual COM.
// Pseudo-C++:
interface IDrawable
{
void Draw();
};
IDrawable这个接⼝定义了任何可绘制的对象必须⽀持的⽅法,(顺便说⼀句,接⼝的名字必须以I开头)。在这个接⼝中,IDrawable接⼝定义了⼀个最简单的操作:Draw。所有的接⼝都是抽象的,故⽽下⾯的代码是不能够编译的。
IDrawable draw;
draw.Draw();
在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类并且重写了类⾥⾯的虚函数。任何使⽤IDrawable的程序必须通过IDrawable指针来处理Shape和Bitmap,⽽不是直接定义Shape 或Bitmap的指针。
IDrawable *pDrawable = CreateTriangleShape();
if(pDrawable)
{
pDrawable->Draw();
}
下⾯是⼀个IDrawablez指针数组的循环。数组可能没有明确的分类(shapes,bitmaps或者其它),但他们都继承IDrawable类。
void DrawSomeShapes(IDrawable **drawableArray, size_t count)
{
for (size_t i = 0; i < count; i++)
{
drawableArray[i]->Draw();
}
}
COM最重要的⼀点就是调⽤代码从来看不到派⽣类。换句话说,你不能够在你的code中声明Shape或者Bitmap类型。所有关于Shape or Bitmap 的操作都是通过使⽤IDrawable指针实现的。通过这种⽅式,COM能够保持接⼝和实现的分隔,从⽽实现多态。需要注意的是,上⾯的代码并不是真正的COM代码,它们只是为了解释说明COM。
当你使⽤COM的时候,你要记住接⼝不是对象!不同的对象能够实现同⼀个接⼝,同⼀个对象也能够实现不同的接⼝。
我要评论