(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(覆盖、重新定义和重新引入方法)

8.4.3 覆盖、重新定义和重新引入方法

​ 正如我们刚才所看到的,要在子类中覆盖一个延迟绑定的方法,需要使用override关键字。只有当该方法在祖先类中被定义为虚方法时,才能进行重载。如果该方法被定义为动态(dynamic)方法(我们稍后将介绍另一个关键字),也可以覆盖该方法。否则,如果该方法未被标记为virtual或dynamic,,则会被视为静态方法,除了修改祖先类的代码外,不能使用延迟绑定对其进行修改。

注解:你可能还记得,在上一章中,我也使用了相同的关键字来覆盖从基类 TObject 继承而来的 Destroy 默认析构函数。

​ 规则很简单: 定义为静态方法在每个子类中仍然保持静态,除非你用一个新的同名虚方法将其隐藏。定义为 virtual 的方法在每个子类中都是延迟绑定的。由于编译器会为延迟绑定的方法生成不同的代码,因此无法改变这种情况。

​ 要重新定义静态方法,只需在子类中添加一个与原方法参数相同或不同的方法,而无需任何进一步的说明。要覆盖虚方法,必须使用相同的参数并使用override关键字:

type
  TMyClass = class
    procedure One; virtual;
    procedure Two; // 静态方法
  end;

  TMySubClass = class(TMyClass)
    procedure One; override;
    procedure Two;
  end;

​ 重新定义的方法Two没有延迟绑定。因此,当你将它应用于基类的变量时,无论如何它都会调用基类方法,即使变量指向的是派生类的对象,而派生类的方法也有不同的版本。

​ 覆盖方法通常有两种方式。一种是用全新的版本替换父类的方法。另一种是在现有方法中添加更多代码。第二种方法可以通过使用inherited关键字来调用祖先类的同名方法来实现。例如,你可以编写:

procedure TMySubClass.One;
begin
  // new code
  ...
  // Call inherited procedure TMyClass.One
  inherited One;
end;

​ 你可能想知道为什么需要使用override关键字。在其他语言中,当你在子类中重新定义一个虚方法时,你会自动覆盖原来的方法。但是,有override这个具体的关键字,编译器就可以检查祖先类中的方法名称与子类中的方法名称之间的对应关系。编译器还会检查该方法在父类中是否为虚方法,等等。

注解:另一种流行的 OOP 语言 C# 也有同样的override关键字。这并不奇怪,因为这两种语言有一个共同的设计者。Anders Hejlsberg 有一些长篇文章解释了为什么override关键字是设计程序库的基本版本工具。更多信息请访问 http://www.artima.com/intv/nonvirtual.html。最近,苹果的 Swift 语言也采用了override关键字来修改派生类中的方法。

​ 这个关键字的另一个优点是,如果你在任何类中定义了一个静态方法,然后被程序库中的类继承,那么即使程序库更新了一个与你定义的方法同名的新的虚方法,也不会有任何问题。因为你的方法没有被override关键字标记,这个方法将被视为一个独立的方法,而不是添加到库中的方法的新版本(这很可能会破坏你现有的代码)。

​ 对重载的支持进一步增加了这种情况的复杂性。子类可以使用Overload关键字为方法提供一个新版本。如果该方法的参数与基类中的版本不同,它实际上就成为了一个重载方法;否则,它就取代了基类方法。下面是一个例子:

type
  TMyClass = class
  	procedure One;
  end;
  
  TMySubClass = class(TMyClass)
  	procedure One(S: string); overload;
  end;

​ 请注意,该方法在基类中无需标记为重载。但是,如果基类中的方法是虚方法,编译器就会发出警告:“方法’One’隐藏了基类类型’TMyClass’的虚方法”。

​ 为了避免编译器发出这条信息,并更准确地指示编译器您的意图,您可以使用特定的 reintroduce 指令:

type
  TMyClass = class
    procedure One; virtual;
  end;
  
  TMySubClass = class(TMyClass)
  	procedure One(S: string); reintroduce; overload;
  end;

您可以在 ReintroduceTest 示例中找到这段代码,并进一步尝试使用。

注解:使用 reintroduce 关键字的一种情况是,你想为一个组件类添加一个自定义的 Create 构造函数,而该组件类已经从 TComponent 基类继承了一个Create 虚构造函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/508755.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Excel 隔几行批量插入空白行

例如如下表格,每隔6行插入一行数据: 1)第7个单元格输入1 2)选中6个单元格,然后双击填充数据: 3)F5 找到常量 Ctrlshift 复制插入的数据,然后选中数据 按F5,定位到空值

第21章-直连路由和静态路由

1. 直连路由 1)定义:指路由器接口直接相连的网段的路由; 2)特点: ① 不需要特别的配置,双UP(物理层数据链路层); ② 在路由器的接口上配置IP地址即可; ③ 开机自动产生; …

如何做用户体验优化

本文是从用户体验优化角度谈用户体验,其实用户体验不是设计必须的步骤,而是分散在产品设计中的产品设计思想。 一、用户体验分类 用户体验是指用户在“使用”某个产品或服务过程中的全部感受,包括情感、信仰、喜好、认知印象、生理和心理反应…

789. 数的范围 (二分学习)

1.确定一个区间,使得目标值一定在区间中 2.找一个性质满足: (1)性质具有二段性 (2)答案是二段性的分界点 3.整数二分(处理红色右端点和绿色左端点) //代码1:右端点 int…

探讨在大数据体系中API的通信机制与工作原理

** 引言 关联阅读博客文章:深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章:深入理解HDFS工作原理:大数据存储和容错性机制解析 ** 在当今数字化时代,数据已经成为企业发展和决策的核心。随着数据规模的不断增长…

网络安全 | 什么是网络安全?

关注WX:CodingTechWork 网络安全 网络安全-介绍 网络安全是指用于防止网络攻击或减轻其影响的任何技术、措施或做法。网络安全旨在保护个人和组织的系统、应用程序、计算设备、敏感数据和金融资产,使其免受简单而不堪其绕的计算机病毒、复杂而代价高昂…

人工智能之深度学习笔记——每天五分钟快速掌握深度学习理论

本专栏会对深度学习以及深度学习搭建技巧做一个详尽的介绍,相信大家阅读完本专栏之后,深度学习已经不是一个遥不可及的名词,我们会知道它究竟是什么,本专栏尽可能地简单详细地介绍每一个深度学习知识,帮助每天只用很少…

vue3中播放flv流视频,以及组件封装超全

实现以上功能的播放&#xff0c;只需要传入一个流的地址即可&#xff0c;当然组件也只有简单的实时播放功能 下面直接上组件 里面的flvjs通过npm i flv.js直接下载 <template><div class"player" style"position: relative;"><p style&…

什么是EDM邮件推广营销?

电子邮件作为最古老的互联网沟通工具之一&#xff0c;凭借其无可比拟的直达性、个性化潜力与高投资回报率&#xff0c;始终占据着企业营销策略的核心地位。随着人工智能技术的革新应用&#xff0c;云衔科技以其前瞻视野与深厚技术底蕴&#xff0c;倾力打造了一站式智能EDM邮件营…

Excel·VBA二维数组组合函数之穷举推理题

看到一个帖子《CSDN-求助一道推理题》&#xff0c;与之前《python穷举暴力破解《2018年刑侦推理题》用python穷举的推理题很类似 那么是否可以使用《ExcelVBA二维数组组合函数、组合求和》combin_arr2d函数&#xff0c;生成结果进行穷举呢&#xff1f; Sub 穷举推理题()Dim …

搜维尔科技:Manus Prime 3 Mocap数据手套,体验极致的每指触觉!

完全适用于VR虚拟现实场景 特斯拉也在使用的量子数据 Tesla 目前正在使用 MANUS Quantum Metagloves创建一个数据集&#xff0c;帮助他们训练 Tesla 机器人。 量子数据训练QUANTUM AI 我们以类似的方式使用 Quantum Metagloves 来生成一流的手指跟踪数据集&#xff0c;并将其…

吴恩达2022机器学习专项课程(一) 4.5 线性回归的梯度下降

问题预览/关键词 本节内容梯度下降公式梯度下降公式的推导过程梯度下降在线性回归误差平方成本函数的收敛梯度下降在多曲面的收敛 笔记 1.本节内容 给线性回归模型的误差平方成本函数执行梯度下降。 2.梯度下降公式 线性回归下误差成本函数的梯度下降公式。 3.梯度下降公…

uniapp 小程序和app map地图上显示多个酷炫动态的标点,头像后端传过来,真机测试有效

展示效果 二、引入地图 如果需要搜索需要去腾讯地图官网上看文档&#xff0c;找到对应的内容 1.申请开发者密钥&#xff08;key&#xff09;&#xff1a;申请密钥 2.开通webserviceAPI服务&#xff1a;控制台 ->应用管理 -> 我的应用 ->添加key-> 勾选WebService…

OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。

介绍 此Demo展示如何在ArkTS中调用相机拍照和录像&#xff0c;以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。 本示例用到了权限管理能力ohos.abilityAccessCtrl 相机模块能力接口ohos.multimedia.camera 图片处理接口ohos.multimedia.image 音视频相关媒体业…

SSM框架学习——MyBatis关联映射

MyBatis关联映射 为什么要关联映射 实际开发中&#xff0c;对数据库操作常常会涉及多张表&#xff0c;所以在OOP中就涉及对象与对象的关联关系。针对多表操作&#xff0c;MyBatis提供关联映射。 关联关系概述 一对一&#xff1a;A类中定义B类的属性b&#xff0c;B类中定义A…

华为云RDS for Mysql入门与配置

华为云RDS for MySQL支持混合SSD实例&#xff0c;它结合了华为云容器、本地SSD盘和高速云盘。 优势&#xff1a; 主备实例提供故障自动切换和手动切换&#xff0c;业务中断时间为秒级&#xff0c;以及异地灾难备份&#xff0c;最大程度上在出现故障的情况下保障整个数据库集群…

自动驾驶杂谈

在2024年的今天&#xff0c;自动驾驶技术已经迈向了一个崭新的阶段&#xff0c;日趋成熟与先进。昨日&#xff0c;我有幸亲眼目睹了自动驾驶车辆在道路上自如行驶的场景。然而&#xff0c;在市区拥堵的路段中&#xff0c;自动驾驶车辆显得有些力不从心&#xff0c;它们时而疾驰…

贝锐蒲公英企业路由器双机热备,保障异地组网可靠、不中断

对于关键业务&#xff0c;比如&#xff1a;在线支付系统、远程医疗监控系统、重要数据中心等&#xff0c;一旦网络发生故障&#xff0c;可能导致巨大的损失或影响&#xff0c;因此需确保网络拥有极高的可靠性、稳定性和容错能力。 面对此类场景和需求&#xff0c;贝锐蒲公英异…

Linux中间件(nginx搭建、LNMP服务搭建)

目录 一、安装nginx 第一步、下载nginx的压缩包到Linux中 ​第二步、安装依赖 第三步&#xff1a;安装 nginx 第四步&#xff1a;启动nginx 第五步&#xff1a;测试nginx 二、 nginx的配置文件 nginx.conf文件内容解读 案例&#xff1a;发布多个网站 二、lamp/lnmp …

【LeetCode】热题100 刷题笔记

文章目录 T1 两数之和T49 字母异位词分组常用小技巧 T1 两数之和 链接&#xff1a;1. 两数之和 题目&#xff1a; 【刷题感悟】这道题用两层for循环也能做出来&#xff0c;但我们还是要挑战一下时间复杂度小于 O ( n 2 ) O(n^2) O(n2)的解法&#xff0c;不能因为它是第一道 …
最新文章