(delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(抽象方法)

8.5 抽象方法与类:

​ 在创建类的层次结构时,有时很难确定哪个是基类,因为基类可能并不代表实际的实体,而只是用来保存某些共享行为。例如,猫或狗类的动物基类。这种不需要创建任何对象的类通常被称为抽象类,因为它没有具体和完整的实现。抽象类可以有抽象方法,即没有实际实现的方法。

8.5.1 抽象方法

abstract关键字被用于声明虚方法,这种虚方法只能在当前类的子类中定义。abstract指令完全定义了方法,不是前向声明。如果尝试定义该方法,编译器将发出警告。

​ 在Object Pascal中,您可以创建具有抽象方法的类的实例。但是,当您尝试这样做时,编译器会发出警告消息:Constructing instance of containing abstract methods。如果您碰巧在运行时调用了抽象方法,Delphi 将引发特定的运行时异常。

注解: C++、Java和其他语言使用了更严格的方法:在这些语言中,您不能创建抽象类的实例。

​ 你可能会问,为什么要使用抽象方法?原因在于多态性的运用。如果类 TAnimal有虚抽象方法 Voice,每个子类都可以重新定义它。

​ 这样的好处是,现在你可以使用通用的FMyAnimal对象来引用由子类定义的每个动物并调用该方法。如果该方法不存在于 TAnimal类的接口中,编译器就不会允许调用,因为编译器会执行静态类型检查。使用通用的FMyAnimal对象,你只能调用由其自身类TAnimal定义的方法。

​ 除非父类至少具有此方法的声明(以抽象方法的形式),否则无法调用由子类提供的方法。下一个示例 "Animals3 "演示了抽象方法的使用和抽象调用错误。下面是这个新示例的类的接口:

typeTAnimal = classprivateFKind: string;publicconstructor Create;function GetKind: string;function Voice: string; virtual; abstract;end;TDog = class(TAnimal)publicconstructor Create;function Voice: string; override;function Eat: string; virtual;end;TCat = class(TAnimal)publicconstructor Create;function Voice: string; override;function Eat: string; virtual;end;

最有趣的部分是TAnimal类的定义,其中包含一个虚抽象方法Voice。同样重要的是,每个派生类都会覆盖这个定义,并添加一个新的虚拟方法:Eat。这两种不同的方法会产生什么影响呢?要调用 Voice 方法,我们只需编写与前一版本程序相同的代码即可:

Show(MyAnimal.Voice);

那么如何调用Eat方法?我们无法将其应用于TAnimal类的对象。语句

Show(MyAnimal.Eat);

生成编译器错误“字段标识符应为预期标识符( Field identifier expected)”。

​ 要解决这个问题,可以使用一个动态的和安全的类型转换,将 TAnimal 对象视为 TCat 或 TDog 对象,但这种方法非常麻烦,而且容易出错:

beginif MyAnimal is TDog thenShow(TDog(MyAnimal).Eat)else if MyAnimal is TCat thenShow(TCat(MyAnimal).Eat);

​ 这段代码将在后面的 "安全类型转换运算符 "一节中解释。在 TAnimal 类中添加虚方法定义是解决问题的典型方案,因为所有动物都吃东西,而且abstract关键字的存在也有利于这种选择。上面的代码看起来很丑陋,而避免这样的代码正是使用多态性的原因,而且在这种情况下,它也代表了我们的实现所模拟的真实世界。

​ 最后,请注意,当一个类有一个抽象方法时,它通常被认为是一个抽象类。不过,你也可以用 abstract 指令特别标记一个类(即使它没有抽象方法,也会被认为是一个抽象类)。同样,在 Object Pascal 中,这不会阻止你创建该类的实例,所以在这种语言中,抽象类声明的用处相当有限。

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

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

相关文章

C++的并发世界(六)——互斥解决数据共享冲突

0.数据共享的问题 在多个线程中共享数据时。需要注意线程安全问题。如果多个线程同时访问同一个变量。并且其中至少有一个线程对该变量进行了写操作。那么就会出现数据竞争问题。数据竞争可能会导致程序崩溃,产生来定义的结果,或者得到错误的热果。为了避免数据竞争问题。需要…

docker部署nacos,单例模式(standalone),使用mysql数据库

文章目录 前言安装创建文件夹"假装"安装一下nacos拷贝文件夹删除“假装”安装的nacos容器生成nacos所需的mysql表获取mysql-schema.sql文件创建一个mysql的schema 重新生成新的nacos容器 制作docker-compose.yaml文件查看网站 前言 此处有本人写得简易版本安装&…

【开发、测试】接口规范与测试

接口测试基础 url 是互联网标准资源地址,称为统一资源定位符 组成:协议,服务器地址,端口号 HTTP协议 HTTP:超文本传输协议,基于请求与响应的应用层协议 作用:规定了客户端和服务器之间的信…

可视化大屏的应用(18):网络安全和信息安全领域

可视化大屏在物联网领域具有以下价值: 实时监控和可视化: 可视化大屏可以将物联网设备和传感器的数据以图表、图形和动画等形式实时展示,帮助用户直观地了解物联网系统的运行状态和数据趋势。通过可视化大屏,用户可以快速发现异…

海外版 双语言爆点游戏 双语音指挥游戏 去中心化投注游戏 双声道音效游戏 附带安装教程

海外版双语言爆点游戏/纯vue源码版/去中心化投注游戏 系统为纯VUE源码,附带安装教程 前端只有一个爆点游戏能玩,去中心化无后台 源码下载:https://download.csdn.net/download/m0_66047725/88991298 更多资源下载:关注我。

为 AI 而生的编程语言「GitHub 热点速览」

Mojo 是一种面向 AI 开发者的新型编程语言。它致力于将 Python 的简洁语法和 C 语言的高性能相结合,以填补研究和生产应用之间的差距。Mojo 自去年 5 月发布后,终于又有动作了。最近,Mojo 的标准库核心模块已在 GitHub 上开源,采用…

使用 XCTest 进行 iOS UI 自动化测试

使用 XCTest 进行 iOS UI 自动化测试是一种有效的方法,可以帮助你验证应用界面的行为和功能。以下是使用 XCTest 进行 iOS UI 自动化测试的基本步骤: 设置项目: 确保你的 Xcode 项目已经包含了 XCTest 测试目标。在测试目标中创建一个新的测试类&#xf…

防火墙状态检测和会话机制

FW对TCP,UDP和ICMP协议的报文创建会话

laravel如何通过DB获取一条数据并转成数组

在 Laravel 中,你可以使用原生数据库查询构建器(DB facade)来获取一条数据,并将其转换为数组。这可以通过在查询链的末尾调用 first() 方法后,使用 toArray() 方法来实现。first() 方法会返回一个 StdClass 对象&#…

hadoop:案例:将顾客在京东、淘宝、多点三家平台的消费金额汇总,然后先按京东消费额排序,再按淘宝消费额排序

一、原始消费数据buy.txt zhangsan 5676 2765 887 lisi 6754 3234 1232 wangwu 3214 6654 388 lisi 1123 4534 2121 zhangsan 982 3421 5566 zhangsan 1219 36 45二、实现思路:先通过一个MapReduce将顾客的消费金额进行汇总,再通过一个MapReduce来根据金…

医疗器械网络安全 | 美国FDA审批程序和欧盟合格评定程序的区别

要进入美国与欧洲市场,均需要通过评定程序审批。 两者的审批流程核心区别在于:所有在美国上市流通的医疗器械产品必须经过FDA的审核认证,才能投放市场。而欧盟市场,医疗器械制造商只需要自证设备合规性,并有指定机构干…

红黑树:自平衡二叉搜索树的原理与实践

红黑树:自平衡二叉搜索树的原理与实践 1.红黑树的性质2. 红黑树的插入和删除3. 伪代码示例4. C代码示例5. 结论 红黑树是一种自平衡的二叉搜索树,它在计算机科学中广泛应用于数据的组织和存储。通过维护特定的平衡条件,红黑树确保了基本动态集…

glm2大语言模型服务环境搭建

一、模型介绍 ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性: 更强大的性能:基于 ChatGLM 初代模型的开发经验&…

代码随想录Day43

Day 43 动态规划 part05(01背包问题part02) 今日任务 最后一块石头的重量 II 目标和 474.一和零 代码实现 最后一块石头的重量 II public int lastStoneWeightII(int[] stones) {int sum Arrays.stream(stones).sum();//表示大小为i的背包中最多能装…

Raven:一款功能强大的CICD安全分析工具

关于Raven Raven是一款功能强大的CI/CD安全分析工具,该工具旨在帮助广大研究人员对GitHub Actions CI工作流执行大规模安全扫描,并将发现的数据解析并存储到Neo4j数据库中。 Raven,全称为Risk Analysis and Vulnerability Enumeration for C…

TomCat如何防止多个服务jar包冲突?

一文讲透 Tomcat 的类加载机制!揭秘类加载核心-腾讯云开发者社区-腾讯云 (tencent.com) 每个服务用不同的应用类加载器加载,就能防止冲突。 注意:TomCat的类加载机制破坏了双亲委派,它是先加载web-app应用类加载器,再…

ConcurrentHashMap在Java 7和Java 8中有何不同?

Java全能学习+面试指南:https://javaxiaobear.cn 在 Java 8 中,对于 ConcurrentHashMap 这个常用的工具类进行了很大的升级,对比之前 Java 7 版本在诸多方面都进行了调整和变化。不过,在 Java 7 中的 Segment 的设计思想依然具有参考和学习的价值,所以在很多情况下面试官都…

Docker 部署开源远程桌面工具 RustDesk

RustDesk是一款远程控制,远程协助的开源软件。完美替代TeamViewer ,ToDesk,向日葵等平台。关键支持自建服务器,更安全私密远程控制电脑!官网地址:https://rustdesk.com/ 环境准备 1、阿里云服务器一 台&a…

【NC16708】过河卒

题目 过河卒 动态规划 思路 我们知道,小卒只能朝右或者下走,先假设没有对方的马。那么对于起点所在的行上的所有位置就只有一种不同路径,因为那些位置只能从左边到达(转换思维),同样那么对于起点所在的列…

【Flutter】windows环境配置

windows 11 环境 官方教程 配置了flutter 环境变量在系统的path里 bin 路径。 死活没反应 关闭了git关闭了dart.exe关闭了vs还是不行卸载重新来 新版git flutter doctor 还需要android 环境