(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)。

相关推荐
cuisidong199727 分钟前
5G学习笔记三之物理层、数据链路层、RRC层协议
笔记·学习·5g
乌恩大侠28 分钟前
5G周边知识笔记
笔记·5g
南宫理的日知录34 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
数据与后端架构提升之路1 小时前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
一行12 小时前
电脑蓝屏debug学习
学习·电脑
咔叽布吉2 小时前
【论文阅读笔记】CamoFormer: Masked Separable Attention for Camouflaged Object Detection
论文阅读·笔记·目标检测
johnny2332 小时前
《大模型应用开发极简入门》笔记
笔记·chatgpt
亦枫Leonlew2 小时前
微积分复习笔记 Calculus Volume 1 - 4.7 Applied Optimization Problems
笔记·数学·微积分·1024程序员节
小肥象不是小飞象2 小时前
(六千字心得笔记)零基础C语言入门第八课——函数(上)
c语言·开发语言·笔记·1024程序员节
星LZX2 小时前
WireShark入门学习笔记
笔记·学习·wireshark