- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
标题:Delphi对象模型学习笔记
摘要
BorlandObjectPascal对象模型(现在已经正是命名为Delphi语言)与其他OOP语言一样,都提供了一些基础服务:如对象创建服务、对象释放服务、对象识别服务、对象信息服务,除此之外在编译器和VCLframework级别上提供了一些额外的服务,例如对象消息分派服务。
前言
首先说一下,Delphi对象模型涉及的概念非常多,因此在这篇笔记中,我无法将所有的知识点都点到,只是理出一条线方便后来人。可以说这部分内容不是很容易搞懂的,建议大家多看VCL源码,它可真是一座金山,有你挖不完的金子,每次你都会有意外收获的。另外有些概念恐怕看源码也不见得搞得懂,这时候你可以通过Debug看看反汇编的结果,通常会看到编译器为你做了很多幕后工作。有了这种钻研精神,我想恐怕没有什么问题解决不了的。
正文
Delphi中万物之源是TObject,不管你自定义的类是否指明了所继承的父类,一定都是TObject的子孙,一样具有TObject定义的所有特性[3]。由于在TObject中已经提供了大部分的对象基础服务,因此继承类自然而然也就具备了这些对象服务,强烈建议每一个学Delphi的朋友都要仔细研习一下TObject的源码。
一个对象的生命周期是从它被创建那一刻开始。通常我们都用类似TMyObject.Create这样的语句创建对象,那么你知道在这一行
代码的后面到底发生了什么事情吗?可以说,发生了无数的事情,对象也从此有了生命。
一,对象创建服务
凡是声明为Constructor的方法都属于构造函数,不管你用不用Create作为方法名称,但建议只用Create作为方法名称;由此可知编译器是根据Constructor这个指示字(directive)来生成构造代码,而不是根据Create这个方法名称,相当一部分人对构造函数的实现过程存在误解。
一个类实例的生成需要经过对象内存分配、内存初始化、设置对象执行框架三个步骤。
编译器首先调用System._ClassCreate进行对象内存分配、内存初始化的工作。而System._ClassCreate调用TObject类的虚方法NewInstance建立对象的实例空间,继承类通常不需要重载TObject.NewInstance,除非你使用自己的内存管理器,因此缺省是调用TObject.NewInstance。TObject.NewInstance方法将根据编译器在类信息数据中初始化的对象实例尺寸(TObject.Ins
tanceSize),调用系统缺省的MemoryManager.GetMem过程为该对象在堆(Heap)中分配内存,然后调用TObject.InitInsta
nce方法将分配的空间初始化。InitInstance方法首先将对象空间的头4个字节初始化为指向对象类的VMT的指针,然后将其余的空间清零。如果类中还设计了接口,它还要初始化接口表格(InterfaceTable)。
当对象实例在内存中分配且初始化后,开始设置执行框架。所谓设置执行框架就是执行你在Create方法里真正写的代码。设置执
行框架的规矩是先设置基类的框架,然后再设置继承类的,通常用Inherited关键字来实现。
上述工作都做完后,编译器还要调用System._AfterConstruction让你有最后一次机会进行一些事务的处理工作。System._AfterConstruction是调用虚方法AfterConstruction实现的。在TObject中AfterConstruction中只是个PlaceHolder,你很少需要重载这个方法,重载这个方法通常只是为了与C++Builder对象模型兼容。
最后,编译器返回对象实例数据的地址指针。
需要注意的是,构造函数是对象和类方法的混合,可以用对象引用或者类引用来调用它[4]。类引用模式会按照上面的步骤进行对象创建,对象引用模式只会执行设置执行框架这一步,TApplication.CreateForm是对象引用的一个实例。
相关TObject方法:
TObject=class
//...
constructorCreate;
classfunctionInitInstance(Instance:Pointer):TObject;
classfunctionInstanceSize:Longint;procedureAfterConstruction;virtual;
classfunctionNewIns
您可能关注的文档
最近下载
- 民用建筑通用规范GB55031-2022(完整清晰版).pdf
- SY_T 4113.1-2018 管道防腐层性能试验方法 第1部分:耐划伤测试.docx VIP
- 江苏省无锡市江阴市长泾片2024-2025学年七年级上学期期中考试语文试题(含答案).pdf VIP
- 燃气安全日常巡检与维护方法.pptx
- 市直机关单位整治群众身边不正之风问题集中整治工作阶段性工作总结.docx VIP
- 地下连续墙施工方案(附:工程临时用电施工方案).doc
- 汽轮发电机组转子找中心计算公式.xls VIP
- 惠州市高2024届高三第二次调研考试政治试卷(含答案).docx
- SY∕T 4113.8-2020 管道防腐层性能试验方法 第8部分:耐磨性能测试.pdf
- HRN日本报知机百仕达五斯消防主机操作说明书.pdf
文档评论(0)