Delphi 对象模型学习笔记.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

dqy118 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体上海海滋实业有限公司
IP属地上海
统一社会信用代码/组织机构代码
91310115MA7DL1JF2N

1亿VIP精品文档

相关文档