Delphi接口编程的两大陷阱

陷阱一、接口的类型转换陷阱

a) 不能把一个对象引用强制转换成这个引用的类型没有声明实现的接口,即使这个对象实际实现了这个接口(呵呵,优点拗口)。

b) 当把一个对象变量赋给一个接口变量,在把这个接口变量赋还给对象变量时,这个对象变量的地址已经变了,也就是不再是原来的对象了,而是指向一个错误的地址。

例如:

I1 = interface
function Do: Boolean;
end;
TC1 = Class
ATT1: Integer;
end;
TC2 = Class(TC1, I1)
ATT2: Integer;
function Do: Boolean;
end;
Intf1: I1;
OBJ1: TC!;
OBJ2: TC2;
OBJ2 := TC2.Create;
OBJ1 := OBJ2.
I1(OBJ2).DO;正确。
I1(OBJ1).DO;编译失败

因为OBJ1的类型TC1没有声明实现I1所以不能转换成I1,即使OBJ1确实实现了I1。

还有,如果把对象转为接口再转回来也会有问题。

OBJ2 := TC2.Create;
OBJ2.ATT1 := 0;
Intf1 := OBJ2;//正确。
OBJ2 := Intf1;
TC2(Intf1).ATT1 := 0; //运行期非法地址访问错误。
OBJ2.ATT1 := 0; //运行期非法地址访问错误。

也就是,从对象引用转换成指针引用后,地址改变了,但是由指针引用再转回对象引用时地址没有变回来(Delphi的bug?)。

陷阱二、接口的生存期管理

依据我的常识(此处是编程常识,不是Delphi使用常识)来讲,我认为接口是不需要生存期管理的,因为接口根本不可能生成真正的对象。但是Delphi却又一次打击了我的常识(咦,为什么要说“又”呢?),它的接口是有生存期的,而且必须实现以下三个方法:

时间: 2024-08-29 13:03:22

Delphi接口编程的两大陷阱的相关文章

《Python硬件编程实战》——2.2 Python的两大版本

2.2 Python的两大版本 目前Python主要有两个大的版本: Python 2 Python 3 Python两大版本的不同写法 关于两种版本的对比,也常写成为 Python 2.x VS Python 3.x Python 2 VS Python 3 py2 VS py3 读者以后看到类似写法,明白其指的是Python 2和Python 3就可以了.2.2.1 Python版本历史 为了更深入地理解Python 2和Python 3的区别,此处先简要介绍Python版本的发展历史. P

面向对象之两大要领 (转)

原文: http://cpper.info/2016/01/05/Two-Points-Of-Oriented-Object.html. 总览 在工作初期,我们可能会经常会有这样的感觉,自己的代码接口设计混乱.代码耦合较为严重.一个类的代码过多等等,自己回头看的时候都觉得汗颜.再看那些知名的开源库,它们大多有着整洁的代码.清晰简单的接口.职责单一的类,这个时候我们通常会捶胸顿足而感叹:什么时候老夫才能写出这样的代码! 作为新手,我们写的东西不规范或者说不够清晰的原因是缺乏一些指导原则.我们手中挥

SQL/NoSQL两大阵营激辩:谁更适合大数据

文章讲的是SQL/NoSQL两大阵营激辩:谁更适合大数据,目前,企业在着手推动大数据项目的过程中,经常会遇到这样一个关键性的决策难题--到底该使用哪种数据库方案?经过综合考量,最终的选项往往只剩下SQL与NoSQL两种.SQL具有骄人的业绩以及庞大的安装基础,但NoSQL却能够带来可观的收益并同样拥有不少支持者.在今天的辩论当中,我们将一同听听两大阵营中各位专家的意见. Network World网站主编John Dix专门组织了此次辩论并邀请到多位专家.其中两位参与专家分别是VoltDB公司C

云计算产业形成两大垄断集团

"云计算"概念在世界范围内迅速蹿红:2010年,中国云计算市场规模达到559.3亿元,同比增长29.3%.预计,2011年-2015年,年复合增长率在50%以上.2011年全球云计算市场规模将达到407亿美元,2020年将增至2410亿美元.到2015年,中国云计算产业链规模将达到7500亿至1万亿元. 但同样迅速的是,在云计算的世界里已经在事实上形成了两大垄断集团.其中,第一大垄断集团是Amazon和Google,第二大垄断集团是EMC和VMware. 第一大垄断集团:Amazon和

SQL/NoSQL两大阵营激辩:谁更适合大数据

企业在着手推动大数据项目的过程中,经常会遇到这样一个关键性的决策难题--到底该使用哪种数据库方案?经过综合考量,最终的选项往往只剩下SQL与NoSQL两种.SQL具有骄人的业绩以及庞大的安装基础,但NoSQL却能够带来可观的收益并同样拥有不少支持者.在今天的辩论当中,我们将一同听听两大阵营中各位专家的意见. NetworkWorld网站主编JohnDix专门组织了此次辩论并邀请到多位专家.其中两位参与专家分别是VoltDB公司CTORyanBetts和Couchbase公司CEOBobWiede

云计算两大垄断集团即将分化

"云计算"概念在世界范围内迅速蹿红:2010年,中国云计算市场规模达到559.3亿元,同比增长29.3%.预计,2011年-2015年,年复合增长率在50%以上.2011年全球云计算市场规模将达到407亿美元,2020年将增至2410亿美元.到2015年,中国云计算产业链规模将达到7500亿至1万亿元. 但同样迅速的是,在云计算的世界里已经在事实上形成了两大垄断集团.其中,第一大垄断集团是Amazon和Google,第二大垄断集团是EMC和VMware. 第一大垄断集团:Amazon和

简化spring(5)--减少不必要的基于接口编程

编程     众所周知,Spring是提倡基于接口编程的.    但也有些Service类,比如SaleOrderManager 和SaleOrderManagerImpl,只有5%的机会再有另一个Impl实现.95%时间里这两兄弟站一起,就像C++里的.h和.cpp,徒增维护的繁琐,所以刚开始用Spring的时候就想去掉它,今天偶然在群里聊起动态代理,算是搞明白了其中的道理,谢谢Sparkle :)      IOC是不会强制基于接口的,是这些Service类一般要使用Spring的声明式事务

关于java与rs232接口编程的问题

问题描述 关于java与rs232接口编程的问题 最近公司给我个问题,就是用java编写rs232,邀请能读取和发送数据,有没有点高手,给点代码阿,包什么的都弄完了!谢谢各位大神.

022_《Delphi模式编程》

<Delphi模式编程> Delphi 教程 系列书籍 (022) <Delphi模式编程> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf   作者: 刘艺 丛书名: Borland/Inprise核心技术丛书 出版社:机械工业出版社 ISBN:7111149491 上架时间:2004-9-11 出版日期:2004 年9月 开本:16开 页码:509 版次:1-1 内容简介 <delphi模式编程>是一本delphi程序员的模式入门和