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

相关推荐
冰帝海岸4 小时前
01-spring security认证笔记
java·笔记·spring
小二·5 小时前
java基础面试题笔记(基础篇)
java·笔记·python
朝九晚五ฺ6 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
wusong9998 小时前
mongoDB回顾笔记(一)
数据库·笔记·mongodb
猫爪笔记8 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
Resurgence038 小时前
【计组笔记】习题
笔记
pq113_68 小时前
ftdi_sio应用学习笔记 3 - GPIO
笔记·学习·ftdi_sio
澄澈i8 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
爱米的前端小笔记9 小时前
前端八股自学笔记分享—页面布局(二)
前端·笔记·学习·面试·求职招聘
alikami10 小时前
【前端】前端学习
学习