6--Delphi的源头TObject

用过delphi的朋友都知道,在Delphi里编代码,所有的类都会继承一个TObject的对象。TObject可以说是DELPHI各类的源头,万物起源之鼻主。它之所以这么重要,因为DELPHI的VCL框架的各类都是因为它而出来的。该类是有OBJECT PASCAL语言定义的,之前我多次提到我看框架的感受:那就是要重视生命周期。既然是面向对象的方法来定义,有开始便有结束。如果一个对象没有开始和结束的话,那么在创建该对象的时候是无法给它分配内存也就无法完成初始化的工作了。所以结合万物起源之根本,肯定有一个Create方法和Destory方法。当然这个方法肯定需要由一个constuctordestructor的函数来修饰。所以我们会在VCL的类源码中可以看到各个类都有自己的构造函数和析构函数。通过构造函数为对象分配了内存,因此当该对象的生命周期结束时就需要将所占用的内存归还给系统,这是一个反向的动作了。

我们在调试程序时,在一个对象析构的时候经常会发现系统先析构自己占用的资源然后再去释放TOBJECT为其分配的资源。通常TOBJECT对象会将destructor Destrory方法设为虚方法(virtual)。这就是为了解决TObject的派生类可能分配额外资源,所以派生类通常是覆盖的(override)方法

当对象分配了内存之后,有一个过程我们可能是看不到的。那就是将对象分配的内存转成实际存储在内存中对象。这应该是VCL有一个专门的内存编译器做的事情。对象初始化的工作跟RTTI和接口等都息息相关起来。当然创建和销毁是需要同时考虑的事情,要不然就会出现内存泄漏的问题。纵观VCL的TOjbect对象,一般具备了对象的创建、销毁、消息分配及对象的识别等功能。

当然当然,TObject对象要做这些事情,是需要一个强大的数据结构来支撑的。在DELPHI7版本的SYSTEM.PAS里我曾看到过关于这个结构的定义。也许你要问VMT是什么?VMT起初我的理解也很晦涩,后来仔细阅读相关资料有一个叫MetaData的术语围绕着它。MetaData的意思就是描述数据结构欣喜的数据,就像我们在数据库中描述一个表的字段名称、字段格式及字段大小等的信息。所以在程序在调试中,代码中相应的对象都是存储在该数据结构里的,该结构都是保存着相应方法对应的地址,我们在调试程序时BUG信息通常会出现一些地址。是的,这些信息就是从该结构中读取出来。这么一说,VMT实际上还是比较简单的,它无非就是编译器用来处理对象的数据结构而已。

好了要说说一个最重要的概念,在我用JAVA开发代码经常听到什么泛型编程之类的术语。后来仔细发现,这些概念其实在VCL里早就做了详细的描述,相应的方法:upcast和downcast。upcast是指派生类转父类的过程,也就是我们常说的向上转型,而downcast则是说父类转变类型变成派生类的过程,也就是我们常说的向下转型了。运用向上转型,和向下转型其实是需要有相应的理解才能将代码写好的。在前些年电子商务网站的开发过程,我曾看过一段泛型代码,大概描述一下:定义了一个父类定义了基本的消息的基本字段,定义了一个派生类定义处理实际业务的字段。这个程序员用了工厂模式实现复杂的业务,实际的业务在派生的对象中装填字段,而在实际的处理却是向上转型的方式,用父类对象处理!这样的写法却是真正理解的泛型编码的真意!其实DELPHI的VCL都诠释了这些方法,只是它过于向上转型,强大的RAD工具让程序员只是做了简单的事情。当然,你也可以在代码中用这样的方式编写,当然在泛型编码中我们一直不是很提倡向下转型的方法,在实际编码中我们实在无法预计到这个过程中会发现什么问题。在delphi的窗口控件form有许多与窗体相关的功能像show,showmodal之类的方法,而这些方法非窗体之外的并没有,如果采取类型转换,势必会出现错了。

TObject对象深入下去还是有许多的内容,比如TObject对象提供了许多类方法,这些类方法都是供子类调用的。有获取类名,占用内存大小等,这些都是在使用编码中的高级用法,不过这些方法却是给真正的DELPHI程序员以帮助。

(未完待续........)

熬之滴水穿石:Delphi曾经的利器(2)相关推荐

  1. 熬之滴水穿石:JAVA的世界(2)

                                   15--JAVA中类型 03年之前写Delphi程序写习惯了,发现在JAVA这个随处充满面向对象的概念中实际上是没有全局变量这么一个概念的 ...

  2. 熬之滴水穿石:Servlet--Web万物之源(1)

                                  25--认识Web容器 03年转到JAVA开发,开始编写基于企业内网的WEB应用.那时候对于JAVA这门语言还是感觉不难,对于WEB应用的开 ...

  3. OrangeUI-Delphi移动开发利器

    OrangeUI-助您快速开发漂亮实用的APP 2013年EMB发布了XE4,开始了Delphi可以直接开发苹果APP的篇章, 同时,OrangeUI就开始了紧锣密鼓的研发,一直到了2017年,耗时四 ...

  4. 熬之滴水穿石:JSP--HTML中的JAVA代码(6)

                                                                       39--JSTL 在JSP编码中需考虑的一种方法,因为这种方法可以 ...

  5. 熬之滴水穿石:一切从windows编程开始(3)

    3--对于windows的任务处理模型的认识 要想真正的掌握windows编程,实际上还是需要从winodws的任务处理架构开始的. 在windows操作系统中有许多程序在运行,它提供了一个多任务可运 ...

  6. 熬之滴水穿石:Servlet--Web万物之源(8)

                                    12--过滤器 不得不说过滤器了,在Web安全中,过滤器也是一个重要的环节.其实过滤器本质就是一个Servlet,当然你可以认为它本身就 ...

  7. 计算机编程oop思想与老子道德经之无有万物

    我们用虚拟的数字计算机来模拟宇宙万物的运行规律. 道,乃电子计算机之设计,之CPU,GPU,Registers,乃操作系统,这些都叫"无". 源代码,是为"有" ...

  8. 批量停进程 linux,linux批量关闭进程

    个人开发者做一款Android App需要知道的事情 个人开发者做一款Android App需要知道的事情 在大学时, 自己是学计算机专业的,而且还和老师一起做过一年半的项目. 有时候是不是有这样的想 ...

  9. vba put 语名 delphi 用什么语句_将VBA数组写入工作表时转置(Transpose)的利用

    大家好,最近推出的内容是"VBA信息获取与处理"中的部分内容,这套教程面向中高级人员,涉及范围更广,实用性更强,现在的内容是第四个专题"EXCEL工作表数据的读取.回填和 ...

最新文章

  1. jni头文件自动生成
  2. sql not in 用法_SQL 语法速成手册
  3. 记一次失败的Windows环境编译Nginx源码
  4. 禅道能连接数据库无法打开页面
  5. 分页查询的SQL语句
  6. 复习zabbix配置agent过程
  7. Splash 简介与安装
  8. UML中依赖(Dependency)和关联(Association)之间的区别
  9. 电脑硬件测试软件哪一个准一点,什么软件测试cpu温度准确_测试cpu温度准确软件汇总 - 系统家园...
  10. 个性化不和谐帐户的8种方法
  11. 面试官问“你还有什么需要了解的吗”——应该这样回答
  12. Python中文数字对照表,学生成绩管理【笔记】
  13. 2019测试指南-web应用程序安全测试(二)指纹Web应用程序
  14. 好用的BUG、内存泄露捕捉工具 EurekaLog v6.0.11 Enterprise For D5-D2007 简体中文汉化版
  15. 大数据比较 同比与环比的区别
  16. JavaScript实现五种排序算法
  17. 手机技巧:苹果手机这8个实用小技巧
  18. 读《Halting in Random Walk Kernels》
  19. 老铁请留步!有奖调查
  20. FZU Monthly-201910 tutorial

热门文章

  1. 软件测试 | 测试开发 | 探究 PHP_CodeSniffer 的代码静态分析原理
  2. 1、债权融资 - 打造企业上市系列文章
  3. 开学季学生党买什么蓝牙耳机好?高性价比无线蓝牙耳机推荐
  4. 1569 B.Chess Tournament
  5. Proxy和Reflect内容详解
  6. GO语言reflect反射篇
  7. easyui部分组件使用经验
  8. 《后浪》:B站该为自己敲响的警钟
  9. 无能狂怒之“恢复VSCode按Enter键换行”问题
  10. cnpm报错:Error: Cannot find module ‘diagnostics_channel‘