优美的设计必然是平衡的。正如:E=mc^2一样,E转换成质量,质量也可转换成E。 现在,提供了从对象到接口的AS,却没有从接口的对象的AS! 另外,如果Delphi不提供AS,那么你是不是就在对象里增加一个方法叫GetInterface呢?这和增加GetObject是一个道理。不在于大家是不是知道怎么实现这个功能,而在于设计本身是不是考虑好这个问题。 |
对象指针和接口指针并不是同一个地址 如果我没误解你的话,我觉得这点并没影响, 但你讲这个设计是个缺点的话? 我会问你对象指针和接口指针是同一地址的情况可能吗? 对象和接口的指针地址都只是引用,是两个完全不同的变量,你不可能期望一个对象的引用和一个接口的引用使用同一个地址,就像你不能期望两个不同的变量使用同一地址一样. 但接口指针和对象指针实际指向同一对象是可以的. 这种情况是实际的对象存储在同一内存空间. 如果没有另一个不同的对象引用,我们的对象又从哪里创建出来? 接口的引用本身是不能创建对象的吧? 你讲的其它几个缺点我更加是不知所云了. (同样呀,"我等小辈水平太有限了") |
对象指针转为接口指针,这是可以理解的,但为什么要从接口指针转为对象指针呢?如果一定要这么做,很可能是设计上出了问题。 顺便提醒一点,如果你是准备从delphi的对象模型中来找结论的话,有一个问题是无法回避的:如果这个接口的实现类不是delphi写的呢? 就算这个实现类是delphi写的,你也得考虑一些问题,例如如果是用接口委托的方式实现的话,是不是会有问题。 写过一个比较变态的函数,如下: { 很变态的一个函数实现。 如果一个类实现了某些接口,现在已经拿到了指向接口的指针,但如果需要拿到对象指针的话, 需要用额外的比较麻烦的方法,这里提供一个函数可以方便拿到对象指针,该函数依赖于 delphi 的内部编译实现,如果这个类是由其他语言实现的话,不可以使用该函数。 因此通常情况下不建议使用该函数。 } function GetObjectFromIntf(Intf: IUnknown): TObject; begin Result:= TObject(Integer(intf) - ((not PByte(PInteger(PInteger(intf)^)^ + 4)^ + 1) and $000000ff)); end; |
看到这么多谦虚的高手,我发现我用了3年的delphi(虽然现在不用了)还基本等于白痴级。没有各位究根刨底的精神。 我发现其实大家都有个共同的,就是也同时在学习研究其它语言。。。 如果以在座各位的水平,能组织起来一起做点东西,也是件不错的事,提倡互相讨论进步,不提倡互相鄙视。 因为在delphi调用com事件响应时嫌搞得有点麻烦,而且还没实现。所以中断了学习。 顺便弱弱的文句,如果也变态的使用同一接口在单线程实现两个不同的对象(虽然一般情况下无此必要),如果接口指针与对象指针一致,那是不是说两个对象。。。,好象有点不太对劲。或者是接口VMT中也有了两处记录,com原理不懂,朋友们给解释下。 |
关于将INTERFACE转换为OBJECT,前提是: 在不使用COM的情况下,只是将INTERFACE做为一般的OO技术使用在设计中。 例如: 由FACTORY创建的对象通常得到的是一个INTERFACE,当这个对象被交还给FACTORY消毁时需要可能需要由INTERFACE转换为OBJECT。 当使用OBJECT POOL时,当传入对象时可能需要由INTERFACE转换为OBJECT。 等等,另外一点是,VCL的设计是基于OBJECT的,当在你的设计中对VCL中的类进行包装时(包装到INTERFACE中),尢其是涉及到VISUAL OBJECT时,往往会发生INTERFACE到OBJECT的转换。 INTERFACE转为OBJECT也不是什么奇怪的事,即然存在这么一项功能,那么就可以考虑:怎么用?用在哪?为什么用?不必急着贴标签,因为技术本来就是这么一回事,没有什么不可以的。 |