(delphi11最新学习资料) Object Pascal 学习笔记---第11章第2节 (接口的多态性)

11.2.4 接口的多态性

​ 在上一节中,我们看到了如何定义多个接口,并让一个类实现其中的两个接口。当然,这可以扩展到任何数量。您还可以创建接口的层次结构,因为一个接口可以继承另一个接口:

ITripleJumper = interface(IJumper) 
	[‘{0876F202-AAD3-11D2-8551-CCA30C584521}’] 
	function TripleJump: string;
end;

​ 这个新接口类型拥有其基接口类型的所有方法(和属性),并增加了一个新方法。当然,接口的兼容规则与类的兼容规则大致相同。

​ 不过本节中我想重点讨论的是一个稍有不同的话题,即基于接口的多态性。给定一个普通的基类对象,我们可以调用一个虚方法,并确保调用的是正确的版本。同样的情况也会发生在接口上。然而,对于接口,我们可以更进一步,经常使用动态代码来查询接口。鉴于对象与接口之间的关系可能相当复杂(一个对象可以实现多个接口,也可以间接地实现它们的基础接口),我们有必要更好地了解在这种情况下可能发生的事情。

​ 首先,假设我们有一个通用的 IInterface 引用。我们如何知道它是否支持某个特定接口呢?实际上有多种方法,它们与类的对应方法略有不同:

  • 使用 is 语句进行测试(也可能使用 as 语句进行后续转换)。这只能用来检查一个对象是否实现了某个接口,但不能用来检查一个接口是否实现了另一个接口(也就是说,不能将 is 应用于接口)。请注意,在任何情况下都需要进行 as 转换,因为直接转换为接口类型几乎都会导致错误。

  • 调用全局 Support 函数,从众多的重载版本选择一个。你可以向该函数传递要测试的对象或接口、目标接口(使用 GUID 或类型名称),还可以传递一个接口变量,如果函数成功执行,实际接口将被存储在该接口变量中。

  • 直接调用 IInterface 基接口的 QueryInterface ,该方法比较底层,总是需要接口类型变量作为额外结果,并使用数字 HRESULT 值而不是布尔结果。

    下面是从同一个 IntfDemo 示例中截取的片段,展示了如何将后两种技术应用于通用 IInterface 变量:

procedure TForm1.Button4Click(Sender: TObject); 
var
	Intf: IInterface;
	WalkIntf: IWalker;
begin
	Intf := TAthlete.Create;
	if Supports(Intf, IWalker, WalkIntf) then
		Show(WalkIntf.Walk);
	if Intf.QueryInterface(IWalker, WalkIntf) = S_OK then 
		Show(WalkIntf.Walk);
end;

​ 与 QueryInterface 调用相比,我完全推荐使用 Supports 函数的一个重载版本。最终,Supports 会调用QueryInterface函数,但Supports 函数提供的选项更简单、更高级。

​ 您想使用接口的多态性的另一个情况是,当您有一个高级接口类型的接口数组时(也可能是对象数组,其中一些对象可能支持给定接口)。

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

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

相关文章

GT2505HS-VTBD 三菱触摸屏手持式5.7寸型

GT2505HS-VTBD 三菱触摸屏手持式5.7寸型 GT2505HS-VTBD参数,GT2505HS-VTBD用户手册,GT2505HS-VTBD使用手册GT2505HS-VTBD参数说明:手持式5.7吋型,VGA 640*480,TFT彩色液晶屏,65536色,内存32MB,DC24V,内置以太网接口。 GT2505HS-VT…

【GlobalMapper精品教程】079:投影坐标系转地理坐标系(UTM转WGS1984/2000)

文章目录 一、矢量UTM转WGS1984/20001. UTM转WGS19842. UTM转CGCS2000二、栅格UTM转WGS1984/2000一、矢量UTM转WGS1984/2000 加载配套实验数据(data079.rar)中的矢量数据,如下所示: 查看源坐标系:双击图层的,图层投影选项卡,为UTM投影,Zone48N。 设置系统坐标系:点击…

jupyter_lab修改默认目录

1、新版本的jupyter如果按照网上说的只修改jupyter_notebook_config.py这个文件没啥用,我在实际修改过程中遇到了如下报错。 经过各种尝试,还需要修改jupyter_notebook_config.py这个配置文件 2、不废话,直接上步骤 在Jupyter Notebook或者c…

2024年10大AI动画工具

在当今快节奏的数字环境中,动画师和内容创作者不断寻求创新工具来提高他们的工作效率和创造力。随着人工智能的出现,动画发生了显着的转变,因此提供了大量的选项,使图像无缝地栩栩如生。 无论你是一位有抱负的动画师还是经验丰富…

#include《初见C语言之顺序表的增删查改》

目录 一、顺序表 二、顺序表的分类 三、顺序表的实现前期准备 第一步,确定需要的文件 第二步,开始分析 四、顺序表的实现 1.初始化 2.销毁 3.申请空间 4.打印 5.尾插 6.头插 7.尾删 8.头删 9.指定位置之前插入 10.指定位置之前删除 11.…

grid的常见使用场景

场景1&#xff1a;固定几列显示&#xff0c;显示不下会自动换行 <div id"container"><div class"item item-1">1</div><div class"item item-2">2</div><div class"item item-3">3</div>&l…

vscode go语言开发中在任意包运行和调试代码 Example使用方法

一般情况下我们在进行go语言开发的时候我们都需要创建一个main方法和main包才能运行go代码&#xff0c; 针对这个问题&#xff0c;go语言给我们内置了功能强大的testing测试框架&#xff0c; 其中一个很有意思的Example测试就非常的方便使用。 他不管你在什么包&#xff0c;也…

LNMP环境部署WordPress——使用源码包安装方式部署环境

目录 一.前提准备 二.源码安装Mysql 1.MySQL类型 2.MySQL 版本说明 3.MySQL 安装方式 3.1 yum 安装 3.2 编译安装 3.3 二进制安装 3.4 rpm 安装 4. 编译安装MySQL5.7 4.1 清理安装环境 4.2 创建mysql用户 4.3 从官网下载tar包 4.4 安装编译工具 4.5 解压 4.6 …

Vue3:路由

1. 路由简介 在Vue3中&#xff0c;路由是一个核心概念&#xff0c;特别是在构建单页面应用程序&#xff08;SPA&#xff09;时。以下是Vue3中路由的基本概念&#xff1a; 1. **路由&#xff08;Route&#xff09;**&#xff1a;在Vue3中&#xff0c;路由是指根据特定的规则将用…

i春秋-Backdoor

题目 考点 git源码泄露 Linux文件恢复 代码审计 http 解题 参考wp https://blog.csdn.net/cbhjerry/article/details/105791056https://www.pianshen.com/article/19461342501/扫描 题目给出提示&#xff1a;敏感文件泄漏 于是使用dirsearch扫一下 python dirsearch.py -…

如何到《新英格兰医学杂志》 NEJM查找下载文献

《新英格兰医学杂志》NEJM是世界上阅读、引用最广泛、影响力最大的综合性医学期刊之一。NEJM集团出版的期刊还包括NEJM Journal Watch、NEJM Catalyst及NEJM Evidence。NEJM是一份全科医学周刊&#xff0c;出版对生物医学科学与临床实践具有重要意义的一系列主题方面的医学研究…

废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

一款基于FastAdminThinkPHPUniApp开发的废品回收系统&#xff0c;适用废品回收站、再生资源回收公司上门回收使用的小程序。 一、FastAdmin框架特色功能及优势 模块化开发&#xff1a;控制器、模型、视图、JS一一对应&#xff0c;使用RequireJS进行插件机制&#xff0c;支持插…

QX----mini51单片机学习---(7)矩阵键盘

目录 1矩阵键盘的识别 2相关c语言 3实践编程 1矩阵键盘的识别 假设按列扫描按下S6P30&#xff1a;0P34&#xff1a;1然后高流向低&#xff0c;P34&#xff1a;0&#xff0c;刚开始是0xf0&#xff1a;1111 0000 后面是0xe0&#xff1a;1110 0000 &#xff0c;当是0xe0能确…

如何通过AI技术实现员工培训的革命性变革

AI个性化培训&#xff1a;开启员工潜力的新篇章 在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的影响力已经渗透到社会的各个层面&#xff0c;包括教育与培训行业。AI技术正在彻底改变我们获取知识与技能的方式&#xff0c;特别是在员工培训领域…

Offline: Overcoming Model Bias for Robust Offline Deep Reinforcement Learning

EAAI 2023 paper Intro model-free的离线强化学习由于价值函数估计问题存在训练的稳定性以及鲁棒性较低。本文提出基于模型的方法&#xff0c;同构构建稳定的动力学模型帮助策略的稳定训练。 method 本文基于模型的方法&#xff0c;所构造的转移模型输入状态动作&#xff0…

【python】python中的argparse模块,教你如何自定义命令行参数

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

C++容器——list

目录 list容器 list容器使用流程 加入头文件 定义 list容器的使用 添加元素&#xff1a; 删除元素&#xff1a; 访问元素&#xff1a; 容器大小&#xff1a; 迭代器操作&#xff1a; 其他操作&#xff1a; list容器 功能&#xff1a;将数据进行链式存储 链表(list…

数据结构--队列

一、认识队列 队列&#xff08;Queue&#xff09;是一种 受限的线性数据结构&#xff0c;具有 先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的特点。 受限之处&#xff1a; 只允许在表的前端&#xff08;front&#xff09;进行删除操作。只允许在表…

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记

论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处…

乡村振兴与乡村振兴战略的深度融合:落实乡村振兴战略,推动乡村全面发展,打造富强民主文明和谐美丽的社会主义现代化新农村

一、引言 在全面建设社会主义现代化国家的新征程中&#xff0c;乡村振兴战略承载着推动乡村全面发展、实现农业农村现代化的重大使命。乡村振兴战略的实施&#xff0c;不仅关系到亿万农民的福祉&#xff0c;也关系到国家整体发展的质量和水平。因此&#xff0c;深化乡村振兴与…