描述:
有个问题:“一直不明白为什么非得用类厂建立com对象”
很多人都这么回答:“类厂是创建组件的组件,必须先创建类厂,再用其创建自己的组件。”
拜托大哥了,求你别这么说了好吧?
这正如我问:“为什么吃西瓜必须用剪刀割开它而不直接打破或用水果刀剖开它”,
你能这么回答吗:“吃西瓜必须用剪刀割开西瓜,然后才能吃到西瓜瓤”?
拜托了,给点专业精神好不好?
其实com规范没规定一定要用类厂去创建组建,类厂就不是,
关键是你得把使用类厂创建组建的好处说透彻啊,
帮人帮到底嘛,您说是不是这个理儿?
火气有点盛,大家见谅!
解决方案1:
如果new,不管人家是否给你开放了一个类的实现代码。但它的头文件就必须是完整的,但private的内容也必须暴露给你。而一旦暴露private下面的内容,就暴露了实现意图。这第一个方面违反了C++设计的准则,也不符合微软要彻底封闭源码的商业精神。但如果不暴露给你,你用该类的dll,在你的EXE 中new一下,就会出错。
所以,微软需要类工厂,如果要把OO进行到底,也需要这样一个东西。它真正屏蔽了细节实现。
我认为对不懂的事情作判断最有创造力,
就好像不懂f1的上海象个小赤佬一样闯进f1圈子,搞的fia狂宰之余还赞叹咱中国人民族创造力一样。
我在想,系统凭一个IUnknown指针,完全可以知道这个指向的对象是否支持某个接口,是否支持
自动化,但是凭什么知道怎样new出这个包容接口的类实例呢,总是要开发者提供一个标准的方法放在
dll里面,并且符合系统的要求,能够让它调用,返回一个指针吧,不然就是根据CLSID
直接在dll里面瞎摸一通,用某种hash表建立CLSID与类型的关系,然后慢慢查找,最后,系统
人性化的自己把对象new了出来,返回,但这样也有个问题,如果是系统来创建,那岂不是实现了
系统不必要的干预用户进程了?这样的话,稍微有点软公司就是霸道到极点。
我感觉,com实际上是一个用户用另一个用户的想法的一个标准,系统只不过通过一个用户建立
的标准来为另一个用户服务而已,好像去饭店,实际上是跟厨师打交道,但是没人会跑到厨房去点菜
,即使没有菜单,也会有个小斯站在你面前记录,或者是台点菜机器人,这个斯或者
玩意儿应该是全世界都有的,是标准接口,但很少有人关心这些东西,它就是class factory,
因此,没有侍者也有其他替代的标准环节,没有class factory,或者有个什么class maker什么的,
没必要关心这个,我们关心的,是写出高效的com组件,更好的为现代化服务,解决温饱,早日打倒列强。倒数第二句当我没说。
我想:
本来com规范没有说一定要实现IClassFactory。
不过我们一般都会使用CoCreateInstance 。而microsoft在这个函数的实现是调用了IClassFactory的。实际上你在默认赞成使用IClassFactory.
为了我们的com能够兼容weiruan的那套,so need 实现这个工厂接口。
至于microsoft为什么要加入这个接口,可能是从设计模式的角度考虑吧。
我的想法,非真理。纯属想法,共探讨,呵呵。。
并不是“非得用类厂建立com对象”,
类厂本身就是一个com对象,
但它一般不是由类厂创建的。
老兄火气可真大呀。
创建COM的方式两种:类工厂和IUnknown.