(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); 
varIntf: IInterface;WalkIntf: IWalker;
beginIntf := TAthlete.Create;if Supports(Intf, IWalker, WalkIntf) thenShow(WalkIntf.Walk);if Intf.QueryInterface(IWalker, WalkIntf) = S_OK then Show(WalkIntf.Walk);
end;

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源RAG框架汇总

前言 本文搜集了一些开源的基于LLM的RAG(Retrieval-Augmented Generation)框架,旨在吸纳业界最新的RAG应用方法与思路。如有错误或者意见可以提出,同时也欢迎大家把自己常用而这里未列出的框架贡献出来,感谢~ RAG应用…

【代码随想录37期】Day04 两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表II

两两交换链表中的节点 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), ne…

光通信行业专业术语解析大全

近期公司内部开展了一期学习交流会,各位同事收获颇多,特别是关于一些专业术语的简称,大家都觉得非常有意思!小编马不停蹄的整理出来分享给大家,希望可以给学习光通信知识的萌新们小小助力! 以下是光通信行…

QRegExp

描述 QRegExp 类使用正则表达式提供模式匹配。 正则表达式或“正则表达式”是一种用于匹配文本中子字符串的模式。这在许多情况下都很有用,例如, 验证 正则表达式可以测试子字符串是否满足某些条件,例如是整数或不包含空格。搜索 正则表达式…

网关路由的方式有哪些

在微服务架构中,网关路由通常用于集中处理请求分发、认证、限流、熔断等任务。以下是几种常见的网关路由配置方式: Spring Cloud Gateway 1. **基于配置文件的路由**: - 在Spring Cloud Gateway中,可以通过YAML或JSON配置文件定…

【Linux】shell编程,()圆括号, []方括号, {}花括号与(())双括号的使用区别

1. ( )圆括号 初始化数组使用圆括号; 命令组,将一系列命令用空格隔开; 命令替换,使用$ 美元符,将命令进行嵌套使用;(有点儿类似于管道符作用的感觉) arr(1 2 3 4 5)2. [ ]方括号 …

【Linux】搭建私有yum仓库(类阿里云)

在搭建本地yum仓库并配置国内镜像阿里云源中了解yum源 yum : Yellow dog Updater,Modified,是一种基于rpm包的自动升级和软件包管理工具。yum能从指定的服务器自动下载rpm包并安装,自动计算出程序之间的依赖关系和软件安装的步骤&…

《Python编程从入门到实践》day25

# 昨日知识点回顾 如何创建多行外星人 碰撞结束游戏 创建game_stats.py跟踪统计信息 # 今日知识点学习 第14章 记分 14.1 添加Play按钮 14.1.1 创建Button类 import pygame.font# button.py class Button:def __init__(self, ai_game, msg):"""初始化按钮…

【Python系列】Python中列表属性提取

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

地下工程中测斜仪的关键应用

地下工程,如隧道、地铁和基坑等项目的建设,对于现代城市的发展至关重要。然而,这些工程的实施往往伴随着诸多风险,特别是与周围土体的稳定性有关的风险。为了确保工程的安全进行,实时监测技术变得尤为关键。其中&#…

vue3专栏项目 -- 三、使用vue-router 和 vuex(下)

一、添加columnDetail 页面 首页有专栏列表(ColumnList组件),专栏列表中有很多专栏,然后点击某个专栏就进入专栏详情页(ColumnDetail组件),专栏详情页中有很多文章,点击某个文章就进…

经开区创维汽车车辆交接仪式顺利举行,守护绿色出行助力低碳发展

5月10日,“创维新能源汽车进机关”交车仪式于徐州顺利举行,20辆创维EV6 II正式交付经开区政府投入使用。经开区陈琳副书记、党政办公室副主任张驰主任、经开区公车管理平台苑忠民科长、创维汽车总裁、联合创始人吴龙八先生、创维汽车营销公司总经理饶总先…

配置管理与IT资产管理:差异与协同共生

在信息技术日新月异的今天,高效、可靠的IT服务管理成为企业竞争力的关键一环。ITIL4 作为业界公认的IT服务管理框架,为我们提供了一套全面而系统的实践指南。在这一框架下,配置管理和IT资产管理作为两大核心实践,虽各有侧重&#…

线路和绕组中的波过程(三)

本篇为本科课程《高电压工程基础》的笔记。 本篇为这一单元的第三篇笔记。上一篇传送门。 冲击电晕对线路上波过程的影响 实际中的导线存在电阻,而且还有对地电导,会消耗一部分能量。但是因为雷击所涉及的传输距离很短,所以几乎可以忽略这…

深入解析RedisSearch:全文搜索的新维度

码到三十五 : 个人主页 在当今的数据时代,信息的检索与快速定位变得尤为关键。Redis,作为一个高性能的内存数据库,已经在缓存和消息系统中占据了重要地位。然而,Redis并不直接支持复杂的搜索功能。为了填补这一空白&am…

【计算机网络】计算机网络概述、计算机网络性能指标 习题1

0 1. 计算机网络可被理解为( )。 A.执行计算机数据处理的软件模块 B. 由自治的计算机互连起来的集合体 C.多个处理器通过共享内存实现的紧耦合系统 D. 用于共同完成一项任务的分布式系统 0 2.计算机网络最基本的功能是( )。 A.数据通信 B. 资源共享 C. 分布式处理 D. 信息综合…

python的deap库使用记录

主要是在遗传符号回归的代码中添加了注释和根据一部分源码做了一点改动 import operator import random import numpy as np import matplotlib.pyplot as plt from deap import algorithms, base, creator, tools, gp from operator import attrgetter##生成数据 def generat…

【Python系列】字节串与字典字节串

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ASP.NET WebApi 如何使用 OAuth2.0 认证

前言 OAuth 2.0 是一种开放标准的授权框架,用于授权第三方应用程序访问受保护资源的流程。 OAuth 2.0 认证是指在这个框架下进行的身份验证和授权过程。 在 OAuth 2.0 认证中,涉及以下主要参与方: 资源所有者(Resource Owner&…

【.NET Cote】你真的了解HttpRuntime类吗

【.NET Cote】你真的了解HttpRuntime类吗 文章目录 【.NET Cote】你真的了解HttpRuntime类吗一、HttpRuntime概述二、HttpRuntime是什么包三、HttpRuntime属性四、HttpRuntime方法五、HttpRuntime.Cache方法六、HttpRuntime.Cache应用 一、HttpRuntime概述 C# HttpRuntime是一…