在李维的《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的一点回报吧。以后还会继续苛评其他类。希望大家继续关注。
分享到:
相关推荐
所有源码都有经过测试,可以运行,放心下载~
CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
Amanda:Amanda机器学习实践.docx
数据集格式:VOC格式+YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:826 Annotations文件夹中xml文件总计:826 labels文件夹中txt文件总计:826 标签种类数:1 标签名称:["Snake"] 每个标签的框数: Snake 框数 = 1147 总框数:1147 图片清晰度(分辨率:像素):清晰 图片是否增强:否 标签形状:矩形框,用于目标检测识别 重要说明:暂无 特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注
RCEP伙伴国技术性贸易壁垒对中国出口贸易的影响研究_刘主光.caj
【光伏功率预测】基于matlab粒子群算法优化高斯过程回归PSO-GPR光伏功率预测(多输入单输出)【Matlab仿真 4373期】
【DELM回归预测】基于matlab蜂虎狩猎算法改进深度学习极限学习机BEH-DELM数据回归预测【Matlab仿真 3847期】
CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
内容概要:本文综述了数据挖掘技术的核心概念和技术,详细介绍了多种数据挖掘算法,包括关联规则挖掘算法(如Apriori、FP-tree),分类算法(如决策树的ID3/C4.5、K-NN、贝叶斯分类)和聚类算法(如K-均值、层次聚类和密度聚类)。此外,文档也探讨了KDD(知识发现过程)、聚类与分类的区别以及聚类分析算法的评估指标等关键议题。 使用场景及目标(期末突击):①理解和掌握数据挖掘的基本原理与常用算法;②应用于各种数据分析场景,如客户分群、推荐系统、市场篮子分析等。
页面居中设置的process
【光伏功率预测】基于matlab高斯过程回归GPR光伏功率预测【Matlab仿真 4372期】
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2540/CC2541上运行,如果是其他型号芯片,请自行调整。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):3154 标注数量(json文件个数):3154 标注类别数:7 标注类别名称:["Healthy-mango","Damaged-mango","Anthracnose","Bacterial-Black-spot","Others","Fruitly","Mechanical-damage"] 每个类别标注的框数: Healthy-mango count = 603 Damaged-mango count = 4419 Anthracnose count = 2840 Bacterial-Black-spot count = 831 Others count = 485 Fruitly count = 2469 Mechanical-damage count = 33 使用标注工具:labelme=5.5.0 标注规则:对类别进行画多边形框polygon 重要说明:可以将数据集用labelme打开编辑,json数据集需自己转成mask或者yolo格式或者coco
一、主要功能 Ventoy能够支持在同一个U盘上存储多个不同的操作系统镜像,并在启动时提供选择菜单,方便用户选择要启动的操作系统。它无需反复格式化U盘,只需将ISO、WIM、IMG、VHD(x)、EFI等类型的文件拷贝到U盘里面就可以启动了,无需其他操作。同时,Ventoy还支持大部分常见类型的操作系统,如Windows、Linux、Unix、VMware、Xen等。 二、使用优势 便捷性:使用Ventoy制作启动盘非常简单,用户只需将U盘插入电脑,运行Ventoy安装程序,按照提示操作即可完成启动盘的创建。此外,Ventoy支持一次性拷贝多个不同类型的镜像文件,并在启动时显示一个菜单供用户选择,大大提高了使用的便捷性。 多系统支持:Ventoy能够支持几乎所有主流的操作系统,满足用户在操作系统选择和使用上的灵活性需求。 快速启动:Ventoy在启动时能够快速加载操作系统选择菜单,减少了用户的等待时间,提高了工作效率。 更新与维护:Ventoy项目保持活跃的更新,开发者不断修复漏洞、优化性能,并增加对新操作系统和硬件的支持。
管理员模块: 系统管理员管理:管理系统管理员的账户和权限。 药品类别管理:管理药品的分类信息。 药品信息管理:管理药品的详细信息,如名称、规格、价格等。 药品供应商管理:管理药品供应商的信息。 员工信息管理:管理医院员工的资料和信息。 药品出库管理:管理药品出库的流程和记录。 药品销量查询统计:查询和统计药品的销售情况。 员工模块: 员工资料修改:员工可以修改自己的个人信息。 药品销售登记:员工记录药品的销售情况。 出库信息查询:员工查询药品出库的相关信息。 环境说明: 开发语言:Java,jsp JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea 部署容器:tomcat
【ELM回归预测】基于matlab人工兔算法优化极限学习机ARO-ELM数据回归预测【Matlab仿真 3834期】
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2540/CC2541上运行,如果是其他型号芯片,请自行调整。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。
Comsol含色散材料光子晶体能带求解。 包含一维光子晶体和二维光子晶体。 共十余个mph文件,包含多个技巧。
【风电功率预测】基于matlab ARIMA结合支持向量机SVM风电功率预测【Matlab仿真 4571期】
【ESN回归预测】基于matlab粒子群算法优化回声状态网络PSO-ESN数据回归预测【Matlab仿真 4383期】