在李维的《inside VCL》中详细描述了VCL中TObject的地位。是的Borland的工程师们有心将Delphi语言做成pure language。所以你几乎可以看到TObject的所有pure pascal的实现。
更重要的,你应该会发现。Delphi将代码的所有运行机制都暴露在我们面前。这也就是Delphi的TObject和C++中的Object以及C#的Object有很大不同的地方。
Delphi将整个语言的机制都在TObject上实现了。消息机制、接口机制、面向对象机制(多态)等等你都可以从TObject的实现代码中看到运行的全部流程。
不管TObject如何优秀,可是TObject正如Borland一样,在它身上总是看到受制于MS的影子。特别是接口机制。我有两点认为TObject的设计不好。
-
对象指针和接口指针并不是同一个地址
-
对象和接口不可以混用
先说说我第一个不满意的地方。说是第一,并不表示是“最”的意思。只是代表“最先”的意思。
在Delphi的TObject中,类在实现了接口之后,其创建的实例中,对象指针和接口指针并不是同一个地址。这个可能大家没有注意到,但是主要通过简单的例子(取两个指针的地址)就可以发现这个现象。
你可能不会在意这个差异。是的,其实也没什么,不是同一个地址,代码照样可以工作。在对象的内存实例模型中,接口的指针直接存储在属性后面(如果存在继承,可能会出现交错的)。因为TObject设计的时候,两个地址不在一起,那么就存在两个问题:
稍微知道对象模型的人,就应该知道对象调用虚拟方法表的过程。只有对象指针可以指向VMT。另外,在接口访问方法的实现代码的时候,也需要传入对象指针。这是为什么?我们知道,一个对象的方法中,有一个隐含的指针,我们一般称它为Self指针。只要不是class function,那么这个Self指针就是指向对象实例的指针。所以在代码的调用过程中,必然有这个转换。
TObject提供的AS操作,可以完成第1个转换,但是可惜的是,TObject并没有提供一个公开的方法来负责第2个转换。这是我认为TObject在这方面设计不好的原因。(JCL代码库中有第2个转换的代码)
第二个我不满意的地方就是TObject在生存期管理上,没有做到和接口一致。我相信这也是许多使用Delphi接口的同志们一致的想法。虽然我们现在看到Java和C#都已经做到这点,可不能不指出的是,在Delphi中,对象和接口不可以混用!
我并不是奢求TObject的生存期可以自管理。毕竟,我还是习惯了“谁创建谁释放”的规则。可是一旦到了接口和对象混合使用的时候,就发生了问题。
这虽然可以解释为接口是Delphi为了迎合COM而后加上的。我们今天却应该来设计一下一种规则,来解决接口混用的问题。我认为可以有一种简单的方式:TObject在Free的时候,发现其接口引用计数不为0的时候,不会Destroy。
目前我们无法做到这点,这是因为Destroy是Delphi默认做的,也就是说,只要调用了Free方法,Destroy必然发生。我们无法完美地改变这个现实。也正因为此,我才认为必须在设计TObject的时候,将这个考虑进去!
OK。尝试重新审视VCL中的各个基础类,其实有点大胆。所以用“苛评”这个词来做标题,表明这完全是我的苛刻,VCL的设计是非常棒的。不过也算是我使用6年Delphi的一点回报吧。以后还会继续苛评其他类。希望大家继续关注。
分享到:
相关推荐
"苛评有加"指严厉批评;"江河日下"通常指事物一天不如一天,这里误用;"大放厥词"指大发议论,多含贬义;"挂一漏万"形容列举不全,遗漏很多;"宵衣旰食"形容勤于政事。成语的正确理解和运用是语文学习中的重要部分。...
2024最新版手把手教你入门vue+springboot开发SpringBoot + vue 管理系统2024最新版手把手教你入门vue+springboot开发SpringBoot + vue 管理系统2024最新版手把手教你入门vue+springboot开发SpringBoot + vue 管理系统2024最新版手把手教你入门vue+springboot开发SpringBoot + vue 管理系统2024最新版手把手教你入门vue+springboot开发SpringBoot + vue 管理系统2024最新版手把手教你入门vue+springboot开发SpringBoot + vue 管理系统2024最新版手把手教你入门vue+springboot开发SpringBoot + vue 管理系统2024最新版手把手教你入门vue+springboot开发SpringBoot + vue 管理系统2024最新版手把手教你入门vue+springboot开发SpringBoot + vue 管理系统2024最新版手把手教你入门vue+springboot开发SpringBoot
R语言学习记录_R-learning
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
小程序&小工具类&生活圈(源码+截图+源码导入教程和视频).zip
实验已预配IP和相关底层路由
OSD_Lyrics是受lrcdis的启发而开发的一款第三方歌词显示程序,它为Linux下的多款播放_osd-lyrics
仿wireshark的简易抓包协议分析_qt5-sniffer
变压器变频器配电柜电路控制原理图CAD施工图纸设备控制图罗茨风机-变频控制柜110KW
1111111111111111111111111111111111111
变压器变频器配电柜电路控制原理图CAD施工图纸设备控制图某干燥窑电气原理图
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
数学建模 【作品名称】:2023年数学建模国赛B题代码 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 问题一 结果存储于q1_result.xlsx文件,由q1.py代码进行生成 问题二 结果存储q2_result.xlsx中,由q2.py代码计算生成 问题三 52条测线,路线效果图 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。
R语言与结构方程模型_R_SEM
行业报告
自制Arduino 扩展板,AD软件做的,包含原理图,PCB.主要是在学习Arduino不想用杜邦线连接LED灯,搞得座位乱七八糟,所以画了一块板,直接插到Arduino上使用,兼容Arduino MEGA 2560
R语言层次聚类_R_hclust
车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别车辆识别
在Qt中实现固件升级的进度条显示窗口,你可以通过创建一个自定义的对话框(Dialog)来完成。这个对话框可以包含一个进度条(QProgressBar)、一些文本标签(QLabel)用于显示状态信息,以及可能的按钮(如取消按钮)来允许用户中断升级过程。
小程序&模版&招聘行业&仿拉钩App小程序(源码+截图+源码导入教程和视频).zip