(delphi11最新学习资料) Object Pascal 学习笔记---第10章第5节(实现类的枚举支持)

10.5 实现类的枚举支持

​ 在第3章中,我们已经看到了如何使用for-in循环作为经典for循环的替代方法。在那一节中,我描述了如何将for-in循环用于数组,字符串,集合和一些其他系统数据类型。只要类定义了枚举支持,就可以将这种循环应用于该类。尽管最明显的示例是包含元素列表的类,但从技术角度来看,此功能是相当开放的。

​ 要在Object Pascal 中支持枚举类中的元素,必须添加一个名为 GetEnumerator 的方法,该方法返回一个类(实际的枚举类),并使用 MoveNext 方法和 Current 属性定义这个枚举类——前者用于在元素之间导航,后者用于返回实际的元素。完成这个步骤以后(我将在第二个实际示例中向您展示如何完成),编译器就可以解析for-in循环,其中目标是我们类,单独元素必须是枚举器的Current属性的相同类型。一旦这样做了(稍后我将在一个实际例子中向你展示如何做),编译器就可以解析一个for-in循环,其中的目标是我们的类,而各个元素必须与枚举器的Current属性的类型相同。

​ 虽然说并不是严格必要,但把枚举器支持类作为嵌套类型来实现似乎是个好主意(这是第 7 章中涉及的一种语言特性),因为单独使用用于枚举的特定类型毫无意义。

​ 下面这个类是 NumbersEnumerator 示例的一部分,它存储了一系列数字(一种抽象集合),并允许对它们进行迭代。这是通过定义一个枚举器实现的,枚举器被声明为嵌套类型,并由 GetEnumerator 函数返回:

type
  TNumbersRange = class
  public
    type
      TNumbersRangeEnum = class
      private
        NPos: Integer;
        FRange: TNumbersRange;
      public
        constructor Create(ARange: TNumbersRange);
        function MoveNext: Boolean;
        function GetCurrent: Integer;
        property Current: Integer read GetCurrent;
      end;
  private
    FNStart: Integer;
    FNEnd: Integer;
  public
    function GetEnumerator: TNumbersRangeEnum;
    procedure Set_NEnd(const Value: Integer);    
    procedure Set_NStart(const Value: Integer);
    property NStart: Integer read FNStart write Set_NStart;
    property NEnd: Integer read FNEnd write Set_NEnd;
  end;

GetEnumerator方法创建了一个嵌套类的对象,用于存储对数据进行迭代的状态信息。

​ 请注意枚举器构造函数是如何保持对实际枚举对象(使用 Self 作为参数传递的对象)的引用,并将初始位置设置为起始位置的:

function TNumbersRange.GetEnumerator: TNumbersRangeEnum;
begin
  Result := TNumbersRangeEnum.Create(Self);
end;

constructor TNumbersRange.TNumbersRangeEnum.Create(ARange: TNumbersRange);
begin
  inherited Create;
  FRange := ARange;
  NPos := FRange.NStart - 1;   //sets the initial positon to the very beginning
end;

注意 为什么构造函数将初始值设置为第一个值减 1,而不是预想中的第一个值呢?实际上,编译器生成的 for-in 循环的代码相当于:首先创建了一个枚举器(enumerator),然后在 MoveNext 返回 True 的情况下执行代码,一直循环直到 MoveNext 返回 False,在循环中使用 Current 方法获取当前元素的值。测试是在获取第一个值之前进行的,因为列表可能没有值。这意味着 MoveNext 会在第一个元素被使用之前被调用。我没有使用更复杂的逻辑来实现这一点,而是简单地将初始值设置为第一个值之前的一个值,这样在第一次调用 MoveNext 时,枚举器就会被定位在第一个值上。

​ 最后,枚举器方法可以让你访问数据,并提供一种方法移动到列表中的下一个值(或范围内的下一个元素):

function TNumbersRange.TNumbersRangeEnum.GetCurrent: Integer;
begin
  Result := NPos;
end;

function TNumbersRange.TNumbersRangeEnum.MoveNext: Boolean;
begin
  Inc(NPos);
  Result := NPos <= FRange.NEnd;
end;

​ 正如你在上面的代码中所看到的,MoveNext 方法有两个不同的目的:移动到列表的下一个元素,以及检查枚举器是否已经到达终点(在这种情况下,该方法返回 False)。

​ 完成所有这些工作后,现在就可以使用for-in循环遍历 range 对象的值了:

​ 输出结果就是介于 10 和 23 之间(包括 10 和 23)的枚举值列表:

10
11
12
13
14
15
16
17
18
19
20
21
22
23

注意: 在 RTL(Run-Time Library) 和 VCL(Visual Component Library) 库中,有许多情况下都定义了枚举器,例如,每个 TComponent 都可以枚举它所拥有的组件。目前缺少的是子控件的枚举。在第 12 章的“使用类助手添加枚举”部分,我们将看到如何创建这样一个枚举。之所以这个示例不在这里,是因为我们首先需要讨论类助手(class helpers)。

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

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

相关文章

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

C语言 | Leetcode C语言题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; struct ListNode* rotateRight(struct ListNode* head, int k) {if (k 0 || head NULL || head->next NULL) {return head;}int n 1;struct ListNode* iter head;while (iter->next ! NULL) {iter iter->next;n;}int add n…

第12章 软件测试基础(第一部分)概念、质量保证、测试用例、测试执行过程

一、软件测试 &#xff08;一&#xff09;定义 动态验证计算机程序对有限的测试用例集是否可产生期望的结果的过程。测试计划是描述了要进行的测试活动的范围、方法、资源和进度的文档。编写测试计划目的&#xff1a;使测试工作顺利进行、使项目参与人员沟通更舒畅、使测试工…

操作系统:线程

目录 前言&#xff1a; 1.线程 1.1.初识线程 1.2.“轻量化”进程 1.3.线程与进程 2.线程控制 2.1.pthread原生线程库 2.2.线程控制的接口 2.2.1.线程创建 2.2.线程退出|线程等待|线程分离|线程取消 2.3.pthread库的原理 2.4.语言和pthread库的关系 2.5.线程局部…

redis核心数据结构——跳表项目设计与实现(跳表结构介绍,节点类设计,随机层级函数)

跳表结构介绍。跳表是redis等知名软件的核心数据结构&#xff0c;其实现的前提是有序链表&#xff0c;思想的本质是在原有一串存储数据的链表中&#xff0c;间隔地抽出一半元素作为上一级链表&#xff0c;并将抽提出的元素和原先的位置相关联&#xff0c;这样重复下去直到最上层…

Android AOSP探索之Ubantu下Toolbox的安装

文章目录 概述安装Toolbox解决运行的问题 概述 由于最近需要进军android的framework,所以需要工具的支持&#xff0c;之前听说江湖上都流传source insight,我去弄了一个破解版&#xff0c;功能确实强大&#xff0c;但是作为多年android开发的我习惯使用android studio。虽然使…

数据分析及AI技术在旅游行业的应用

引言 旅游行业是一个充满潜力和机遇的领域&#xff0c;而数据分析和人工智能&#xff08;AI&#xff09;技术的迅猛发展为这个行业带来了前所未有的机遇和挑战。本文将探讨数据分析及AI技术在旅游行业中的具体应用及其带来的影响。 数据分析在旅游行业的4种应用 在旅游行业…

【开源设计】京东慢SQL组件:sql-analysis

京东慢SQL组件&#xff1a;sql-analysis 一、背景二、源码简析三、总结 地址&#xff1a;https://github.com/jd-opensource/sql-analysis 一、背景 开发中&#xff0c;无疑会遇到慢SQL问题&#xff0c;而常见的处理思路都是等上线&#xff0c;然后由监控报警之后再去定位对应…

附录3-小程序常用事件

目录 1 点击事件 tap 2 文本框输入事件 input 3 状态改变事件 change 4 下拉刷新事件 onPullDownRefresh() 5 上拉触底事件 onReachBottom() 1 点击事件 tap 2 文本框输入事件 input 可以使用 e.detail.value 打印出当前文本框的值 我现在在文本框中依次输入12345&…

APScheduler定时器使用:django中使用apscheduler,使用mysql做存储后端

一、基本环境 python版本&#xff1a;3.8.5 APScheduler3.10.4 Django3.2.7 djangorestframework3.15.1 SQLAlchemy2.0.29 PyMySQL1.1.0二、django基本设置 2.1、新增一个app 该app用来写apscheduler相关的代码 python manage.py startapp gs_scheduler 2.2、修改配置文件s…

Typora+PicGo+阿里云OSS搭建个人博客图床(2024最新详细搭建教程)

创作者&#xff1a;Code_流苏(CSDN) 目录 一、什么是图床&#xff1f;二、准备工作三、配置PicGo四、配置Typora五、使用 很高兴你打开了这篇博客&#xff0c;如有疑问&#xff0c;欢迎评论。 更多好用的软件工具&#xff0c;请关注我&#xff0c;订阅专栏《实用软件与高效工具…

基于肤色模型的人脸识别FPGA实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 matlab2022a的测试结果如下&#xff1a; vivado2019.2的仿真结果如下&#xff1a; 将数据导入到matlab中&#xff0c; 系统的RTL结构图如下图所示…

安装“STM32F4 Discovery Board Programming with Embedded Coder”MATLAB获取硬件支持包失败

安装“STM32F4 Discovery Board Programming with Embedded Coder”MATLAB获取硬件支持包失败 -完美解决方法 显示请续订您的软件维护服务&#xff0c;解决办法 根据知乎的文章 MATLAB获取硬件支持包失败&#xff0c;显示请续订您的软件维护服务&#xff0c;解决办法&#xff…

为家庭公网IP配置DDNS域名

文章目录 域名配置域名更新frp配置修改 在成功完成frp改造Windows笔记本实现家庭版免费内网穿透之后&#xff0c;某天我突然发现内网穿透失效了&#xff0c;一番排查之后原来是路由器对应的公网IP更换了。果然我分到的并不是固定的公网IP&#xff0c;而是会定期变化的。为了免受…

头歌:SparkSQL简单使用

第1关&#xff1a;SparkSQL初识 任务描述 本关任务&#xff1a;编写一个sparksql基础程序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1. 什么是SparkSQL 2. 什么是SparkSession。 什么是SparkSQL Spark SQL是用来操作结构化和半结构化数据的接口。…

【深耕 Python】Data Science with Python 数据科学(18)Scikit-learn机器学习(三)

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文一览&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&…

2024五一杯数学建模C题思路分享 - 煤矿深部开采冲击地压危险预测

文章目录 1 赛题选题分析 2 解题思路2.1 问题重述2.2 第一问完整思路2.2 二、三问思路更新 3 最新思路更新 1 赛题 C题 煤矿深部开采冲击地压危险预测 煤炭是中国的主要能源和重要的工业原料。然而&#xff0c;随着开采深度的增加&#xff0c;地应力增大&#xff0c;井下煤岩动…

搜索引擎的设计与实现参考论文(论文 + 源码)

【免费】搜索引擎的设计与实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89249705?spm1001.2014.3001.5501 搜索引擎的设计与实现 摘要&#xff1a; 我们处在一个大数据的时代&#xff0c;伴随着网络信息资源的庞大&#xff0c;人们越来越多地注重怎样才能…

汽车车灯的材料是什么?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车车灯的材料主要包括灯罩和灯底座两部分&#xff0c;它们所使用的材料各不相同。 车灯罩的材料主要是透明且具有良好耐热性和耐紫外线性能的塑料。其中&#xff0c;聚碳酸酯&#xff08;PC&#xff09;是一种常用的材料&#xff0c;它具有高抗冲击性、耐化学品腐蚀和优良的…

Pandas入门篇(二)-------Dataframe篇4(进阶)(Dataframe的进阶用法)(机器学习前置技术栈)

目录 概述一、复合索引&#xff08;一&#xff09;创建具有复合索引的 DataFrame1. 使用 set_index 方法&#xff1a;2.在创建 DataFrame 时直接指定索引&#xff1a; &#xff08;二&#xff09;使用复合索引进行数据选择和切片&#xff08;三&#xff09;重置索引&#xff08…