前言
首先说一下,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.instancesize),调用系统缺省的 memorymanager.getmem 过程为该对象在堆(heap)中分配内存,然后调用 tobject.initinstance 方法将分配的空间初始化.initinstance 方法首先将对象空间的头4个字节初始化为指向对象类的 vmt 的指针,然后将其余的空间清零.如果类中还设计了接口,它还要初始化接口表格(interface table). 当对象实例在内存中分配且初始化后,开始设置执行框架.所谓设置执行框架就是执行你在 create 方法里真正写的代码.设置执行框架的规矩是先设置基类的框架,然后再设置继承类的,通常用 inherited 关键字来实现. ... 下一页