(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(虚方法与动态方法)

8.4.4 继承和构造函数

​ 正如我们所见,您可以使用inherited关键字在派生类的方法中调用基类的同名方法(或者也不同方法)。对于构造函数也是如此。在其他语言(如C++、C#或Java)中,对基类构造函数的调用是隐式和强制性的(当必须向基类构造函数传递参数时),而在Object Pascal中,调用基类构造函数并不是强制性的。

​ 但在大多数情况下,手动调用基类构造函数是非常重要的。例如,任何组件类都是如此,因为组件的初始化实际上是在TComponent类级别完成的:

pascal 复制代码
constructor TMyComponent.Create(Owner: TComponent);
begin
  inherited Create(Owner);
  // 具体的代码...
end;

​ 这一点尤为重要,因为对于组件来说,Create 是一个虚方法。同样,对于所有类来说,Destroy 析构函数也是一个虚方法,您应该记得在其中调用inherited。

​ 还有一个问题: 如果你要创建一个只继承自 TObject 的类,你是否需要在它的构造函数中调用TObject.Create 构造函数?从技术角度看,答案是 "不需要",因为构造函数是空的。不过,我认为无论如何,始终调用基类构造函数是一个好习惯。不过,如果你是一个性能狂人,我承认这可能会不必要地减慢你的代码...减慢的速度只有一微秒,完全无法察觉。

​ 玩笑归玩笑,这两种方法都有很好的理由,但特别是对于语言初学者来说,我建议始终调用基类构造函数,这是一种良好的编程习惯,能促进更安全的编码。

8.4.5 虚方法与动态方法

在 Object Pascal 中,有两种不同的方法可以激活延迟绑定。你可以将方法声明为Virtual(如前所述),或者声明为Dynamic方法。这两个关键字的语法完全相同,使用它们的结果也一样。不同的只是编译器用来实现延迟绑定的内部机制。

虚方法基于虚方法表(或 VMT,俗称 vtable)。虚方法表是一个方法地址数组。在调用虚方法时,编译器会生成代码,跳转到存储在对象虚方法表第 n 个槽中的地址。

虚方法表允许快速执行方法调用。虚方法表的主要缺点是需要为每个子类的每个虚方法创建一个条目,即使该方法在子类中没有被重新定义。有时,这会导致在整个类的层次结构中重复虚方法表项(即使是没有重新定义的方法)。这可能需要大量内存来多次存储相同的方法地址。

另一方面,动态方法使用方法的独立编号来进行调用。搜索相应函数的速度通常比虚方法的简单一步查表要慢。但这样做的好处是,动态方法条目只有在后代覆盖该方法时才会在后代中传播。对于大型或较深的对象层次结构,使用动态方法而不是虚方法可以显著节省内存,而对速度的影响微乎其微。

从程序员的角度来看,这两种方法的区别仅在于内部表示不同,速度或内存使用量略有不同。除此之外,虚方法和动态方法是一样的。

在解释了这两种模式的区别后,有必要强调的是,在大多数情况下,应用程序开发人员使用的是虚方法而不是动态方法。

Windows 上的消息处理程序

​ 在为 Windows 构建应用程序时,可以使用特殊用途的延迟绑定方法来处理 Windows 系统消息。为此,Object Pascal 提供了另一个指令 message 来定义消息处理方法,这些方法必须是带有适当类型的单个 var 形参的过程。在 message 指令之后,是该方法要处理的 Windows 消息的编号。例如,下面的代码允许你处理用户定义的消息,其数值由 WM_USER Windows 常量表示:

pascal 复制代码
type
  TForm1 = class(TForm)
    procedure WmUser(var Msg: TMessage); message WM_USER;
  end;

过程的名称和形参的实际类型由您决定,只要物理数据结构与 Windows 消息结构相匹配即可。用于与 Windows API 接口的单元包括许多为各种 Windows 消息预定义的记录类型。对于熟悉 Windows 消息和 API 函数的资深 Windows 程序员来说,这种技术非常有用,但这种技术绝对不兼容其他操作系统(如 macOS、iOS 和 Android)。

相关推荐
球求了10 分钟前
C++:继承机制详解
开发语言·c++·学习
时光追逐者1 小时前
MongoDB从入门到实战之MongoDB快速入门(附带学习路线图)
数据库·学习·mongodb
一弓虽1 小时前
SpringBoot 学习
java·spring boot·后端·学习
晓数2 小时前
【硬核干货】JetBrains AI Assistant 干货笔记
人工智能·笔记·jetbrains·ai assistant
我的golang之路果然有问题2 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
genggeng不会代码2 小时前
用于协同显著目标检测的小组协作学习 2021 GCoNet(总结)
学习
lwewan2 小时前
26考研——存储系统(3)
c语言·笔记·考研
搞机小能手3 小时前
六个能够白嫖学习资料的网站
笔记·学习·分类
nongcunqq3 小时前
爬虫练习 js 逆向
笔记·爬虫
汐汐咯4 小时前
终端运行java出现???
笔记