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

2024-04-03 08:36

本文主要是介绍(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(虚方法与动态方法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

8.4.4 继承和构造函数

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

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

constructor TMyComponent.Create(Owner: TComponent);
begininherited 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 常量表示:

typeTForm1 = class(TForm)procedure WmUser(var Msg: TMessage); message WM_USER;end;

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

这篇关于(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(虚方法与动态方法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/872419

相关文章

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2