学习到的关于Delphi的接口

Delphi的接口,据说是很牛X的东西,总体感觉来说,没有想象的那么好。很多Delphi相关的很牛的技术都没有用过。

好吧,其实自己了解也并不多,更不用说很深层次的东西了,讲一讲自己经历的痛苦中得出来的一些东西吧。

1. 同一个对象的一种接口的地址都是一样的。

这个当初我也是很迷茫,在网上找了不少的资料,书上也基本没有说。说白了就是接口的内存空间的问题,接口的内存空间是在声明接口的时候分配的吗,Delphi接口有自己的内存空间吗。其实Delphi的内存空间是依附着对象,其实按道理上来讲也确实是这样的。但一般的情况是,把一个对象赋给一个接口之后,这个对象一般是不会自己去释放的,这个对象的的生命的结束就是这个接口来管理了。

所以在改Bug的过程中,经常做的一件事情就是验证接口的地址是否一致,如果不一致的话,肯定是有问题的。

2. 接口强转

接口强转有很多办法,例如,support,as,还有直接进行类型转换。但是很多都是有隐患的,只有通过support的返回值判断是否支持才是足够安全的。所以如果没有确切的把握一般不要用其它的办法,还是用support吧。现在我越来越觉得,很有必要这样做,这样不管以后的变动,影响都是最小的。

而且我还遇到一个很销魂的问题,用support转换之后,返回已经成功转换了,但是接口的地址还是没有变。这似乎是有违规律的,后来才发现,这个接口早就已经有问题了,在前面已经进行了不合法的强转,这样就没有办法了,就会产生莫名其妙的问题。

3. 一种比较麻烦的接口存储

如果存储大量的接口的话,用List肯定访问起来有时候是不够方便的,可能会想到用Hash,这就会造成一些问题,可能存储的时候就需要转换为数值或其它的,而不是以接口的形式存在了,然后在取出的时候转回来。取出来的时候肯定要进行类型强转,但已经没有了类型的信息,所以是很不安全的。

所以必须确保,存进去和取出来的接口是一致的,取出来之后可以再进行其它的操作。

 4. 转换的原理

说句实话,我也不是很懂。在网上看到了一些相关的试验性的代码,在对象的存储空间里有指针指向一个接口表,其实类型的转换都是靠这个表来实现的,就是接口查询,经常容易看到这个函数。

BTW: 居然在网上看到一篇韩小明的写的从接口里获得对象的文章,不知是不是真的这个人。 好吧,Delphi的对象确实不是一般。

 

posted @ 2011-12-03 21:55  男人要像向狼一样活着  阅读(268)  评论(0)    收藏  举报