1. 关于COM的趋势
CLR替代了COM,但是无法也没有替代COM+,COM+现在叫.NET Enterprise Services。
目前可以说,如果以前你用COM技术在COM+环境下工作的很好(或者很痛苦),那么现在用CLR在COM+下工作起来一样也很好,并且要方便,快捷;dotNET使得开发人员使用COM+更加方便和有效率,这就如同许多年以前从字符键盘界面(COM)引入图形鼠标界面(dotNET)是对计算机的使用(COM+)的一场革命一样。
COM还有STL的思想不灭。
2. 组件、对象、ActiveX、OLE和COM的关系
组件是一个可重用的模块,它是由一组处理过程、数据封装和用户接口组成的业务对象(Rules Object)。
COM和 CORBA是处在整个体系结构的最底层,OLE和ActiveX是建立在 COM之上的。
COM是应OLE的需求而诞生的,所以虽然COM是OLE的基础,但OLE的产生却在COM之前。
ActiveX是指宽松定义的、基于COM的技术集合,而OLE仍然仅指复合文档。当然, ActiveX最核心的技术还是COM。
让对象模型完全独立于编程语言,这是一个非常新奇的思想。COM对象可以用C++、Java和VB等任意一种语言编写,并可以用DLL或作为不同过程工作的执行文件的形式来实现。随着计算机网络的发展,COM进一步发展为分布式组件对象模型,这就是DCOM,它类似于CORBA的ORB。
3. 单重继承和多重继承
多继承这个东西,不管是理论上,还是实际项目中,都是需要的。但它有两方面的问题,一方面,虽然需要,但需要的情况不多;另一方面,实现起来又有些麻烦,比如指针类型转换时需要做偏移。于是就产生了一个问题:克服很多麻烦去实现一个使用得并不多的东西,到底值不值得。VB和JAVA选择了不实现它,C++则选择了实现它。但JAVA做了很多折衷:比如允许实现多个接口,还允许类的内部类再继承别的类。
多重继承的滥用会导致一些副作用,最典型的是菱形继承的二义性问题,比如:class B 和 class C 从 class A 继承。class D 从 class B 和 Class C 继承。那么 class D 访问 class A 的成员的时候,就有两条路径。当 class B 和 class C 各自覆盖了这个成员,那么到底应该调用哪个成员呢?就出现了二义性。
JAVA为避免c++那样管理多重继承的层次关系而带来的复杂性,换成用接口来实现多重继承的大部分功能。
VB6也同样不支持类继承。但是支持接口继承。
直接的继承VB确实不支持,但可以通过其他的方法模仿出继承和派生类的效果,就是过程没有C那么方便,大致方法有点像封壳。
比如:如果想继承一个类的所有属性和方法和事件,那么可以先引用该类并在你的类中创建该对象。然后然后将其所有的属性、事件、方法的读写属性过程、事件产生及方法调用的过程都在你的类中进行调用和传递,然后还可以添加自己的属性、方法、事件,这样的效果就很像继承后派生出来的类了。虽然方法比较麻烦,但可以做到类似的效果。
开发复杂度: 多重继承 < 单继承
维护复杂度: 多重继承 > 单继承
4. 附:讨论贴列表
[1] http://topic.csdn.net/u/20090514/22/2da3fb91-d5c8-47c2-9573-434adf0c6ba9.html
[3] http://topic.csdn.net/u/20090630/22/c57e315f-da22-4d2f-ab79-13d519416d16.html
感谢这几个帖子里ahao、caozhy、SupermanKing、Tiger_Zhao、steedhorse、supergreenbean、lyserver等网友的指教。