(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 "演示了抽象方法的使用和抽象调用错误。下面是这个新示例的类的接口:

type
  TAnimal = class
  private
    FKind: string;
  public
    constructor Create;
    function GetKind: string;
    function Voice: string; virtual; abstract;
  end;

  TDog = class(TAnimal)
  public
    constructor Create;
    function Voice: string; override;
    function Eat: string; virtual;
  end;

  TCat = class(TAnimal)
  public
    constructor 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 对象,但这种方法非常麻烦,而且容易出错:

begin
  if MyAnimal is TDog then
    Show(TDog(MyAnimal).Eat)
  else if MyAnimal is TCat then
    Show(TCat(MyAnimal).Eat);

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

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

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

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

相关文章

跟着Kimi Chat学习提示工程Prompt Engineering!让AI更高效地给你打工!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

【JavaWeb】百度地图API SDK导入

百度地图开放平台 | 百度地图API SDK | 地图开发 (baidu.com) 登录注册,创建应用,获取AK 地理编码 | 百度地图API SDK (baidu.com) 需要的接口一:获取店铺/用户 所在地址的经纬度坐标 轻量级路线规划 | 百度地图API SDK (baidu.com) 需要的…

Fastjson 1.2.47 远程命令执行漏洞复现分析环境

Fastjson 1.2.47 远程命令执行漏洞 1、靶机环境安装 1.1、虚机机linux环境参数 1、操作系统:CentOS Linux release 7.4.1708 (Core) 2、IP:192.168.127.1321.1、docker与docker compose安装 1.2、下载https://github.com/vulhub/vulhub/tree/master/…

Golang | Leetcode Golang题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; func myAtoi(s string) int {abs, sign, i, n : 0, 1, 0, len(s)//丢弃无用的前导空格for i < n && s[i] {i}//标记正负号if i < n {if s[i] - {sign -1i} else if s[i] {sign 1i}}for i < n && s[i] >…

java数据结构与算法刷题-----LeetCode417. 太平洋大西洋水流问题

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 深度优先遍历 深度优先遍历 解题思路&#xff1a;时间复杂度O( …

【计算机视觉】四篇基于Gaussian Splatting的SLAM论文对比

本文对比四篇论文&#xff1a; [1] Gaussian Splatting SLAM [2] SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM [3] Gaussian-SLAM: Photo-realistic Dense SLAM with Gaussian Splatting [4] GS-SLAM: Dense Visual SLAM with 3D Gaussian Splatting …

RTX RTOS 操作实例分析之---线程(thread)

0 Preface/Foreword 1 线程&#xff08;thread&#xff09; 1.1 线程定义 1.1.1 USE_BASIC_THREADS&#xff08;宏定义&#xff09; 经过以上步骤&#xff08;makefile包含&#xff09;&#xff0c;USE_BASIC_THREADS在编译阶段被定义到相应的模块中。 1.1.2 定义线程ID变量…

element-ui collapse 组件源码分享

今日简单分享 collapse 组件的源码实现&#xff0c;主要分为四个方面&#xff1a; 1、collapse 组件页面结构 2、collapse 组件属性 3、collapse 组件事件 4、collapse item 组件属性 一、collapse 组件页面结构 二、collapse 组件属性 2.1 value/v-model 属性&#xff0…

Linux终端人性化vimrc编辑配置

目录 vim常用操作 扩展之批量注释 扩展之批量替换 .vimrc pyhon代码补全功能安装 效果预览 .bashrc 终端命令行预览时间 vim常用操作 常用的操作有很多&#xff0c;基本上总会用到的例如 x 删除当前字母 dd 删除正行 i 当前光标插入数据 a 当前位置后插入数据 …

安装Schedule库的方法最终解答!_Python第三方库

安装Python第三方库Schedule 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 Schedule库 Schedule 是一个轻量级、功能强大而灵活的任务调度工具库&#xff0c;用于在指定的时间间隔内执行任务。为用户提供了简单易用的…

标题:探索AI绘画:使用深度学习生成艺术

正文&#xff1a; 随着计算机技术的发展&#xff0c;人工智能在各个领域取得了显著的成果。通过训练深度学习模型&#xff0c;AI可以学习大量的艺术作品&#xff0c;从而生成具有独特风格和创意的新作品。 本文将介绍如何使用Python和TensorFlow实现一个简单的AI绘画程序。 二、…

云原生:应用敏捷,华为视角下的应用现代化

Gartner 也提出&#xff0c;到 2023 年&#xff0c;新应用新服务的数量将达到 5 亿&#xff0c;也即是说&#xff1a;“每个企业都正在成为软件企业”。据IDC 预测&#xff0c;到 2025 年三分之二的企业将成为多产的“软件企业”&#xff0c;每天都会发布软件版本。越来越多的企…

AI绘图:Stable Diffusion WEB UI 详细操作介绍:基础篇

接上一篇《AI绘图体验&#xff1a;Stable Diffusion本地化部署详细步骤》本地部署完了SD后&#xff0c;大家肯定想知道怎么用&#xff0c;接下来补一篇Stable Diffusion WEB UI 详细操作&#xff0c;如果大家还没有完成SD的部署&#xff0c;请参考上一篇文章进行本地化的部署。…

vue2+element-ui 实现OSS分片上传+取消上传

遇到问题&#xff1a;项目中需要上传500MB以上的视频。一开始使用上传组件el-upload&#xff0c;调用后台接口&#xff0c;但是出现了onprogress显示百分百后接口一直pending&#xff0c;过了很多秒后接口才通&#xff0c;如果遇到大文件的话&#xff0c;接口就会报超时。 解决…

【javaScript】DOM编程入门

一、什么是DOM编程 概念&#xff1a;DOM(Document Object Model)编程就是使用document对象的API完成对网页HTML文档进行动态修改&#xff0c;以实现网页数据和样式动态变化的编程 为什么要由DOM编程来动态修改呢&#xff1f;我们就得先理解网页的运行原理&#xff1a; 如上图&a…

机器学习每周挑战——信用卡申请用户数据分析

数据集的截图 # 字段 说明 # Ind_ID 客户ID # Gender 性别信息 # Car_owner 是否有车 # Propert_owner 是否有房产 # Children 子女数量 # Annual_income 年收入 # Type_Income 收入类型 # Education 教育程度 # Marital_status 婚姻状况 # Housing_type 居住…

C_C++数据的在内存中的分布

C/C内存分布 在编程世界中&#xff0c;C和C语言一直以其强大的性能和灵活性著称。然而&#xff0c;这种强大和灵活的背后&#xff0c;离不开对内存分布的深入理解和熟练掌握。本文将详细介绍C/C程序中的内存分布&#xff0c;包括栈、堆和全局变量的存储区域。下面是c/c中&…

如何在本地搭建集成大语言模型Llama 2的聊天机器人并实现无公网IP远程访问

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&#xff0c;包括聊天机…

x-cmd-pkg | broot 是基于 Rust 开发的一个终端文件管理器

简介 broot 是基于 Rust 开发的一个终端文件管理器&#xff0c;它设计用于帮助用户在终端中更轻松地管理文件和目录&#xff0c;使用树状视图探索文件层次结构、操作文件、启动操作以及定义您自己的快捷方式。 同时它还集成了 ls, tree, find, grep, du, fzf 等工具的常用功能…

Python爬虫之分布式爬虫

分布式爬虫 1.详情介绍 分布式爬虫是指将一个爬虫任务分解成多个子任务&#xff0c;在多个机器上同时执行&#xff0c;从而加快数据的抓取速度和提高系统的可靠性和容错性的技术。 传统的爬虫是在单台机器上运行&#xff0c;一次只能处理一个URL&#xff0c;而分布式爬虫通过将…