COM可以用vb, java, C++语言进行编写, 它只关心组件的功能,与语言无关。可以把组件编译成dll的格式或者exe格式。
COM的鲁棒性----可以对com组件进行升级,使旧的程序仍然能够运行,而新的程序可以利用组件的新特性。
COM的位置透明性------客户机不需要知道组件的存放的位置
COM也有面向对象的特性----封装 继承 多态
组件需要提供接口给外部使用--------------------------所以它有一个可爱的名字: 服务器(server)
而使用组件的软件实体-----------被迫只能喊为: 客户机(client)
COM的主要工作是解决接口的实现和使用等问题
这是C++的对外接口
class IMath
{
virtual int Add(int a, int b) = 0;
virtual int Subtract (int a, int b) = 0;
};
用户可以使用它的接口来实现自己的代码
COM也是和它差不多的,他们之间的其他差异在于:
1----COM 的语言无关性
2----COM的位置透明性
#include <string> #include <iostream> class Fruit { public: virtual void Draw(){} private: std::string m_strcolor; }; class Apple : public Fruit { virtual void Draw() { std::cout << "I am an apple \n"; } }; class GrannySmith : public Apple { virtual void Draw() { std::cout << "I am a Granny smith Apple\n"; } }; class banana : public Fruit { virtual void Draw() { std::cout << "I am an bananana \n"; } }; class orange : public Fruit { virtual void Draw() { std::cout << "I am an orange \n"; } }; int main () { Fruit* f[5]; f[0] = new Apple; f[1] = new GrannySmith; f[2] = new banana; f[3] = new orange; f[4] = new orange; for (int i =0; i < 5; i++) { f[i]->Draw(); } return 0; }
输出结果:
I am an apple
I am a Granny smith Apple
I am an bananana
I am an orange
I am an orange
上面就是C++的一个简单的多态例子。这里利用虚函数和动态绑定
如果你使 Fruit中的虚函数Draw,变成纯虚函数。则这个类就变为了抽象类,那么派生类必须实现它
virtual void Draw() = 0;
C++是使用虚表(vtable)来实现动态绑定的,COM也是使用C++中的虚表结构来建立组件的接口。因为虚表是一个包含函数地址的数组。
因为COM使用了一个vtable指针,所以COM接口中只能提供方法。
//下一章 :既然如此相似, 那么如何从一个C++的类转变到COM组件