描述:
1 关于句柄类
句柄类也完全可以实现:接口和实现的分离,Don Box在书中也讲到这一点,但是vc开发com组件好像没有采用句柄类的,像MFC采用的嵌套类技术,ATL采用的抽象基类的多继承,模版技术,为什么句柄类没有得到应用???谁能给解释解释
2关于嵌套类
com的本质是一个接口与实现分离的C++类,如何实现接口和实现的分离是一个问题,通过用纯虚类做为基类来实现接口和实现的分离,我可以理解,但是嵌套类怎么能实现接口和实现的分离,那位老大能给解释一下??
纯虚类可以作为接口,是因为纯虚类不包含数据成员,只是通过虚函数表可以提供接口函数的入口地址
但是嵌套类就不同了,它有自己的数据成员,比如CCmdTarget类,ccmdtarget是如何来体现二进制的接口协议的呢?
欢迎高手参加讨论,如果你们能将嵌套类实现com二进制协议接口讲述的很清楚的话,我开贴另谢
解决方案1:
楼上说付出了什么严重的代价
解决方案2: to:phoenixsharp(小星星)
嘿嘿~~
COM真的有这么简单就好了。
个人觉得COM为了跨越语言界限付出了很重的代价,加上跨进程、线程间对象
引用让人觉得学习COM只有“难”一个字。
[引用]:
(1) COM组件实际上是一个C++类,而接口都是纯虚类。组件从接口派生而来。我们可以简单的用纯粹的C++的语法形式来描述COM是个什么东西:
class IObject
{
public:
virtual Function1(...) = 0;
virtual Function2(...) = 0;
....
};
class MyObject : public IObject
{
public:
virtual Function1(...){...}
virtual Function2(...){...}
....
};
看清楚了吗?IObject就是我们常说的接口,MyObject就是所谓的COM组件。切记切记接口都是纯虚类,它所包含的函数都是纯虚函数,而且它没有成员变量。而COM组件就是从这些纯虚类继承下来的派生类,它实现了这些虚函数,仅此而已。从上面也可以看出,COM组件是以 C++为基础的,特别重要的是虚函数和多态性的概念,COM中所有函数都是虚函数,都必须通过虚函数表VTable来调用,这一点是无比重要的,必需时刻牢记在心。
<<COM本质论>>的确不错,小潘译的,昨天DOWN回去看了开头的章节...感觉就像一个节目的口号"原理是什么,这夜我们说清楚!!".
呵呵...正在学习..希望大家多交流一下心得.
ccmdtarget当然不是抽象基类,确切的说,它是接口实现类的外套类,同时也是一个接口实现类。
从接口继承的类是接口实现类,再从这个类继承的类也是实现类,同样嵌套了该类的类也是实现类。
class A:public IXXX {...}
class B:public A {...}
class C {
...
class C1 : public IXXX {...}
...
}
以上A、B、C都是接口实现类(COM对象),因为它们都有一个共同的特点,就是其类实例都拥有一个特殊的成员变量-IXXX的vptr和都拥有一个虚函数表。
C就是使用嵌套类的情况,ccmdtarget就是这种类。
顶!!!!!!!!!!!!!!
解决方案7:有哪位高人来解释一下V表..实在搞不懂..
解决方案8: 接口都是纯虚类,它所包含的函数都是纯虚函数,而且它没有成员变量。而COM组件就是从这些纯虚类继承下来的派生类,它实现了这些虚函数,仅此而已..[引用]
俺也是才学习COM.大致和楼上的理解差不多...
观注.......
1.句柄类确实可以基本做到把对象的行为和实现相分离(还不够),但是远谈不上做到了COM的实际要求,首先句柄类本身就存在实现,它要负责转发接口函数的请求给实际的实现类,这就要求它要了解实现类的细节,所以说,句柄类只是对客户隐藏了对象的实现,但它较接口来讲又与对象的实现类过于耦合。另外,使用句柄类在每一次方法调用至少要多执行一次方法调用(即本身的调用转发函数),再者,应用起来也太麻烦,需要为每个接口函数写转发实现。
2.嵌套类的方法是指把多个实现单一或一组简单接口的实现类包装成一个类,由于这个类内部的类实现了接口,所以它本身并不从接口继承,也不存在接口函数实现。当然基本的IUnkown方法还是实现了,但仅仅是起到向内部实际的接口实现类做转发,由于各个内部实现类各自实现自己的接口方法,所以不存在接口方法名冲突的问题(多继承时会出现同名方法实现相互覆盖的问题),这在对已有复杂类库进行COM化时大有好处,所以MFC的COM实现使用了这种方法。具体原理很简单,《COM本质论》里有介绍,不多说了。
我也刚学,瞎说点自己的看法
com和mfc写法相比就是多了个壳子,这个壳子(应该就是你说的包装类)支持其他语言的调用,实现2进制级的代码重用
问题1太深刻了,俺不知道,第2个我觉得它的变量和控件的属性差不多,主要是自己用,别人想要用通过函数接口来访问,我也想听权威的解释,只是用用感觉很不爽,总想弄明白这些问题
你学多少了,你是用mfc写的,还是直接用atl写的
解决方案12:我也很困惑