ATL实战开发指南笔记-----2.1

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组件

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章