《Delphi高手突破》分享
广联达
软件股份有限公司 企业定额项目部 工具产品线 郭旭茹 2012年9月20日
第一章
重新认识DELPHI
? 真正的程序员用 C++,
? 聪明的程序员用 Delphi! ? 真正聪明的程序员用 C++ 来理解
Delphi! ——孙鑫
DELPHI的优势
? 开发的高效
– 真正面向对象的、 CodeInsight 技术
? 语言的高效
– 基于Object Pascal 语言:真正支持面向对象而 又优雅美观的语言。功能健全又不贪多
? 编译的高效
– 编译本地代码快
DELPHI的优势
? 执行的高效
– 生成目标代码快 – 代码独立执行、分发
? 维护的高效
– 受到VCL限制
第二章
面向对象编程理论基础
为什么采用面向对象的思想
? 面向过程程序设计是以功能为中心,基于 功能分解的程序设计范型 ,是以
计算机的 角度分析问题
–
程序 =过程 + 调用
? 面向对象程序
设计是从客户的角度来分析
问题,更接近现实世界,接近人的思维习 惯
– 程序 = 对象 + 消息
类和对象的本质
? 客观世界中任何一个事物都可以看成一个 对象 ? 类是多个对象进行综合抽象的结果 ? 类是对一类事物的抽象,是创建 对象的模板;对象是类的实例。 ? 类是用户自定义的数据类型,对 象是类类型的变量
类的声明
? 类成员分为方法和数据成员,数据成员表 示类对象的状态,方法是改变类状态的操 作。 ? type
– TMyClass = class
?
声明了一个类
对象的创建
? var
– MyObj : TMyClass;
? begin
– MyObj := TMyClass.Create(); – ...
?
声明了一个对象
构造函数
? Construct ? Create()是这个类的构造函数,它负责初始 化对象数据成员。 ? 即使没有构造函数,对象也可以被创建, 因为内存的分配是由编译器自动完成的。 如果没有会对数据进行清零操作。
内存分配方式
? 堆
– ‘自由存储区’ – 必须手动释放内存 – 复杂类型
? 栈
– ‘自动存储区’ – 由编译器和
系统自动完成内存释放。 – 简单类型
析构函数
? Destruct ? 析构函数都需要加override声明。
– 如果不加override关键字,用户定义的Destroy 隐藏了基类的虚方法TObject.Destroy(),那样的 话,在多态的情况下就无法正确析构对象了。
? 在析构对象的时候,应该调用对象的Free() 方法而不是直接调用Destroy()。
_ 在TObject的Free()方法中会判断对象本身是否 为nil,如果不为nil则调用对象的Destroy(),以 增加安全性
逆过程
? 构造函数先分配内存后初始化数据 ? 析构函数先销毁对象后回收内存
对象的大小
? 对象的大小,就是其数据成员所占用的内 存空间的总和,其方法(函数)是不占用 对象空间的。 ? InstanceSize() ? 指向对象的VMT(虚方法
表)的指针。 ? 编译器的字节对齐优化
– 编译器会将无法合并的小于32位空间的数据域 填充到32位大小,以加快存取速度。
类方法和类应用
? 对象方法:该方法可以更改对象的数据成 员的值
– procedure TMyClass2.SetValue(Value : Integer);
? 类方法:可以改变类的状态
– class function TObject.ClassName: ShortString; – 无法对对象的数据成员进行操作。
类引用
? 类引用:‘类之类’。
– TMyClassClass = class of TMyClass; – 可以 调用类的类方法
– 构造函数可以调用类方法,但是析构函数不是 类方法,销毁时只能调用析构函数free。
类和对象
? 类是对一种逻辑的抽象,而对象则是这种 逻辑的具体实例。
– 类的第一要务是隐藏实现细节,提供明晰接口。 – 类的对象必须有生命状态
类
? 类必须有表示其实例对象的状态的数据成 员。
– 私有成员
? 类的接口必须能够简化客户访问它的逻辑
– 隐藏细节
? 具有状态信息,接口简单、明了,易用。
– 隐藏实现细节,提供明晰接口
封装
? 把程序块中可变的部分和稳定的部分分离 开来,将稳定的部分暴露给其他块,而将 可变的部分隐藏起来,以便于随时可以让 它改变。
类级别的封装
? private
– 类的私有性质,仅有类本身和友元可访问
? protected
–