前些天看MFC源码时觉得MFC对COM的实现比较有意思。首先简单说说COM,它是微软组件化实现的基础,它规定了很多接口,可以认为是一些通信标准。COM是微软很多跨进程跨机器应用的基础,它为进程间或者模块间通信提供了一个接口,其中一个优秀的闪光点就是它将通信媒体虚拟化,这样进程间通信就可以通过很多方式实现,而不仅仅是共享内存了。
MFC对COM多接口的实现是通过聚合实现的。一开始我很吃惊,实现多个接口不就应该继承这些接口,然后在类中实现他们吗,怎么还可以并且确实用聚合去实现呢?用聚合实现的优势很明显,这类似派生和组合之间的差异,而聚合就是一种强耦合关系的组合。用聚合实现自然比多继承实现要好的多,问题是这在语法上居然能实现!仔细看了COM的IUnknown接口才恍然大悟,似乎微软在设计这个基本接口时就考虑到用聚合实现多接口了,它在语法上就给了一个支持。我感觉巧妙之处就在QuaryInterface上。使用聚合实现多接口的主要问题就在怎样从多接口派生实例的一个接口类型指针转换成另一种接口类型指针。通过多继承很容易实现,先Down-Cast,再Up-Cast,水到渠成,然而通过聚合则很难实现。但是COM却很容易通过聚合实现,因为我们可以通过QuaryInterface从一个实现的接口跳到另一个接口。而且MFC在实现接口跳转时(也就是接口查询)采用了接口映射表,从而提高了接口查询速度。
关于MFC中的技巧我想不用多说了,当然也有很多人认为MFC垃圾,我感觉这其中大多是技术难度问题吧。仔细想想多继承和聚合差别并不大,仅仅是语义上的区别而已。当然我这是从二机制角度说的,从软件工程角度说差距自然天壤之别,呵呵。
MFC对COM多接口的实现是通过聚合实现的。一开始我很吃惊,实现多个接口不就应该继承这些接口,然后在类中实现他们吗,怎么还可以并且确实用聚合去实现呢?用聚合实现的优势很明显,这类似派生和组合之间的差异,而聚合就是一种强耦合关系的组合。用聚合实现自然比多继承实现要好的多,问题是这在语法上居然能实现!仔细看了COM的IUnknown接口才恍然大悟,似乎微软在设计这个基本接口时就考虑到用聚合实现多接口了,它在语法上就给了一个支持。我感觉巧妙之处就在QuaryInterface上。使用聚合实现多接口的主要问题就在怎样从多接口派生实例的一个接口类型指针转换成另一种接口类型指针。通过多继承很容易实现,先Down-Cast,再Up-Cast,水到渠成,然而通过聚合则很难实现。但是COM却很容易通过聚合实现,因为我们可以通过QuaryInterface从一个实现的接口跳到另一个接口。而且MFC在实现接口跳转时(也就是接口查询)采用了接口映射表,从而提高了接口查询速度。
关于MFC中的技巧我想不用多说了,当然也有很多人认为MFC垃圾,我感觉这其中大多是技术难度问题吧。仔细想想多继承和聚合差别并不大,仅仅是语义上的区别而已。当然我这是从二机制角度说的,从软件工程角度说差距自然天壤之别,呵呵。