`
zhmocean
  • 浏览: 202291 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

DELPHI高手突破读书笔记--类/对象篇

阅读更多

---------------------------------------------------

那什么样的开发工具才是优秀的、体贴的、以人为本的?我的标准是符合以下四点:
(1)能够将要解决的问题简化,并以某种理念快速实现之。
(2)不隐藏任何用户想知道的细节。
(3)可以忽略用户所不想知道的细节。
(4)主动去适应不同层次的程序员。

---------------------------------------------------

永远不要直接调用对象的Destroy(),而应该是Free()。

---------------------------------------------------

类是一道带门的墙,它保护一些东西、隐藏一些东西,同时对外开放一些东西。不能将墙内的所有东西都暴露出来,也不能关闭大门,封闭所有。隐藏实现细节,提供明晰接口是类的第一要务。

---------------------------------------------------

在定义类时,将所有数据成员都声明为public。但实际程序运行结果(指每个数据成员所在地址)并不依赖于它是处于public的还是private的。也就如同上面所说的,即使派生类对象无法访问基类子对象中的private的数据,它们依然是存在并占用内存空间的,无法访问它只是因为编译器为它做了额外的保护。

---------------------------------------------------
覆盖和重载

覆盖是指派生类重新定义基类的虚方法的方法。而重载,是指允许存在多个同名函数,这些函数的参数表不同(或许是参数个数不同,或许是参数类型不同,或许两者都不同)。重载的概念并不属于“面向对象编程”。重载的可能的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说)。例如,有两个重载的同名函数

function func(p : integer) : integer; overload;
function func(p : string) : integer; overload;

那么编译器做过修饰后的函数名可能是:int_func、str_func。如果调用

func(2);
func(′hello′);

那么编译器会把这两行代码分别转换成:

int_func(2);
str_func(′hello′);

这两个函数的调用入口地址在编译期间就已经静态(记住:是静态!)确定了。这样的确定函数调用入口地址的方法称为早绑定。

而覆盖则是:当派生类重定义了基类的虚方法后,由于重定义的派生类的方法地址无法给出,其调用地址在编译期间便无法确定,故基类指针必须根据赋给它的不同的派生类指针,在运行期动态地(记住:是动态!)调用属于派生类的虚方法。这样的确定函数调用地址的方法称为晚绑定。引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚绑定,它就不是多态”。

---------------------------------------------------

多态的本质就是“将派生类类型的指针赋值给基类类型的指针”(在Object Pascal中是引用),只要这样的赋值发生了,就是在应用多态了,因为在此实行了“向上映射”(“上下”是指类继承层次关系)。

---------------------------------------------------

TObject类有一个虚拟的Destroy析构函数和一个非虚拟的Free方法。Free方法中首先判断对象本身是否为nil,保证不为nil时便调用Destroy。对任何对象(都是TObject的派生类对象)调用其Free();方法,但执行的都是TObject.Free();(因为TObject.Free()为非虚拟方法,无法被覆盖),然后由它调用被每个类重定义了的析构函数Destroy();(因为Destroy()为虚方法,派生类可以覆盖),这就保证了任何类型的对象都可以正确、安全地被析构。

---------------------------------------------------

被派生类覆盖的方法,则会将派生类实现的方法的入口地址填入VMT中以取代基类被覆盖的方法。派生类的虚方法表完全继承了基类的虚方法表,只是将被覆盖了的虚方法的地址改变了。

---------------------------------------------------

由于DMT中不会出现没有被派生类覆盖的基类dynamic方法,因此DMT会比VMT节省空间(大多数情况下)。当基类有许多虚方法,而派生类只覆盖很少几个时,区别尤其明显。当派生层次越来越深,派生类数量越来越多,DMT就能节省更多的内存空间。但是DMT中对基类的动态方法的寻址不是直接进行的,因此dynamic方法的寻址比virtual方法要慢许多。

virtual和dynamic的区别仅在于编译器采用不同的晚绑定策略而已,对于程序员来说,它们的功能相同。

如何取舍就看实际的需求了,一般情况下,几乎每个派生类都要覆盖的方法,将它声明为virtual;如果类层次很深,或派生类很多,但某个方法只被很少的派生类覆盖,则将它声明为dynamic。
另外需要注意的是,只有VMT才与C++、COM的vtable兼容,因此当需要这样的兼容性时,只能使用virtual。

分享到:
评论

相关推荐

    log4 DELPHI 日志

    日志组件log4delphi与log4j、log4cpp如出一辙 1.安装:log4Delphi无需安装,直接解压包解压后放入任意目录(我的目录是:'D:/3rdlib/delphi/log4delphi-0.7)即可。 2.使用:在工程文件中引用解压包中src目录下...

    ffmpeg-delphi-pascal-headers-3.0.2.zip_FFVCL_delphi vlc_ffmpeg_f

    "ffmpeg-delphi-pascal-headers-3.0.2.zip" 是一个针对 Delphi 用户的 FFmpeg 头文件包,包含了 FFmpeg 3.0.2 版本的 Pascal 头文件,适用于 Delphi 的 FFVCL 库。 FFVCL (FFmpeg Video Component Library) 是一个 ...

    Delphi7 multipart/form-data实现上传文件

    总的来说,Delphi 7 使用 Indy 10 的 `TIdHTTP` 控件和 `TIdMultipartFormDataStream` 类可以方便地实现 `multipart/form-data` 方式的文件上传。理解这些组件的工作原理和使用方法,对于开发涉及文件交互的Web应用...

    HyperStr 6.01 for Delphi 2010

    One of the most significant new features with Delphi32 is long dynamic strings. However, the built-in functions don't really exploit the full potential of these new strings. HyperString provides ...

    014_《Delphi高手突破》

    其次,它可能会讲解Delphi的核心概念,如对象和类的使用,这是面向对象编程的基础。此外,还可能深入到VCL(Visual Component Library)框架,这是Delphi开发用户界面的主要工具集,包括各种控件、窗体和组件的使用...

    Delphi高手突破(官方版)_delphi_delphi学习_

    通过阅读《Delphi高手突破(官方版)》这本书,读者可以逐步了解并掌握这些知识点,从而提升Delphi编程的水平。书中的实例和练习将有助于理论与实践相结合,帮助读者将所学应用到实际项目中,成为真正的Delphi高手。

    Delphi-OpenCV-Class-main

    Delphi binding for OpenCV Experimental Delphi binding for OpenCV 4.7.0 Development environment - Delphi 10.4, 11 x64 platform only

    LMD 2014.3 Complete FS - Delphi 6-XE6 / C++ Builder 6-XE6 - 32 / 64 bit

    LMD 2014.3 Complete FS - Delphi 6-XE6 / C++ Builder 6-XE6 - 32 / 64 bit Incl. Demo + Help files LMD VCL Complete 2014.3 (16 April 2014) Contains LMD-Tools, IDE-Tools and LMD ElPack Delphi XE6 ...

    Delphi 高手突破

    本书《Delphi高手突破》由申旻编著,旨在为已有一定Delphi编程基础的程序员提供深入理解和运用面向对象编程(OOP)的方法。书中通过理论与实践相结合的方式,详细介绍了如何在Delphi环境中构建具有良好设计结构的应用...

    delphi-modbus-develop.zip_delphi_delphi-modbus-1.6.7_modbus_modb

    最新版 delphi-modbus-develop 1.6.7

    delphi-modbus-tcp-indy.7z

    Delphi是一种强大的面向对象的编程语言,常用于开发桌面应用程序,而Modbus TCP是一种工业通信协议,用于设备间的网络通信,特别是PLC(可编程逻辑控制器)和其他自动化设备。这个"delphi-modbus-tcp-indy.7z"压缩包...

    Delphi高手突破 PDF图书

    通过阅读《Delphi高手突破》,读者不仅可以提升Delphi编程技能,还能了解到软件开发的最佳实践,为自己的职业生涯增添一份有力的武器。书中的实例和练习将帮助读者巩固理论知识,提高实际操作能力,从而成为一名真正...

    Delphi高手突破附书源码

    《Delphi高手突破》是一本深受程序员喜爱的技术书籍,它主要针对那些希望深入掌握Delphi编程语言的专业人士。这本书不仅提供了丰富的理论知识,更强调实践操作,通过一系列精心设计的实例来帮助读者提升技能。附带的...

    Delphi高手突破-目录

    ### Delphi高手突破关键知识点概览 ...通过以上内容的梳理,可以看出《Delphi高手突破》这本书旨在帮助Delphi程序员从理论到实践层面全面提升编程技能,特别是在面向对象编程方面提供了丰富的资源和指导。

    Delphi高手突破(官方版)

    综上所述,《Delphi高手突破》是一本全面介绍了面向对象编程理论与实践的指南,特别适合有一定Delphi基础并希望进一步提升编程技能的开发者。无论是从理论知识还是实践经验方面,本书都能够为读者提供宝贵的资源和...

    Delphi西门子PPI协议S7-200VB的PLC通信控件实例.rar

    Delphi西门子PPI协议S7-200VB的PLC通信控件实例,调试时请注意:1、请先运行目录中的安装控件,程序自动注册siemens.ocx控件,到C:\WINDOWS目录下。  2、delphi下控件的安装请参考图片中的安装步骤。  注意:在...

    delphi高手突破源码

    《Delphi高手突破源码》是一份针对Delphi编程语言深度学习的资源,它涵盖了从基础到高级的各种技术,旨在帮助开发者提升在Delphi领域的专业技能。这份源码集合不仅包含了许多实际应用的示例,还揭示了Delphi编程的...

    delphi高手突破.rar

    《Delphi高手突破》是一份面向已有编程基础的开发者的学习资料,旨在帮助他们提升在Delphi编程领域的技能和深入理解。Delphi是一款强大的Windows应用程序开发工具,以其高效的编译器和面向对象的Pascal语言(Object ...

    《Delphi高手突破》PDF电子书

    《Delphi高手突破》这本书是面向那些希望深入学习Delphi编程技术的开发者们的一本专业指南。Delphi,由Embarcadero Technologies开发,是一款强大的Windows应用开发工具,以其快速的编译器和面向对象的Pascal语言而...

    DELPHI学习笔记----获取WINDOWS进程信息.pdf

    在本学习笔记中,我们将详细探讨如何在使用DELPHI语言进行Windows开发时获取和管理Windows进程信息。这包括对相关Windows API函数的深入了解,特别是那些与进程列表和模块列表相关的函数。此外,我们还将分析如何...

Global site tag (gtag.js) - Google Analytics