(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(延迟绑定和多态性)

本文主要是介绍(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(延迟绑定和多态性),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

8.4.2 延迟绑定和多态性

​ Object Pascal 函数和过程通常基于静态绑定,也称为早期绑定。这意味着方法调用是在编译或链接时解决的。面向对象编程语言允许延迟绑定或动态绑定,即根据用于调用的实例类型在运行时确定要调用的方法。

​ 这种技术的优势被称为多态性。多态性允许你编写方法调用,并将其应用到变量上。但是,Delphi 会根据变量指向的对象类型来确定实际要调用的方法。由于前面讨论过的类型兼容性规则,Delphi 在运行前无法确定变量所指对象的实际类别。

​ 与 C++ 和 C# 类似,Object Pascal 方法默认为早期绑定。这被认为更有效率。而 Java 则默认为延迟绑定(并提供了向编译器表明可以使用早期绑定优化方法的方法)。

​ 假设一个类及其子类(比方说 TAnimal 和 TDog)都定义了一个方法,并且该方法可以延迟绑定。现在你可以将此方法应用于一个通用变量,如 FMyAnimal,该变量在运行时可以引用 TAnimal 类的一个对象,也可以引用 TDog 类的一个对象。实际调用的方法将在运行时根据当前对象的类确定。

​ Animals2 示例扩展了 Animals1 项目,演示了这一技术。在新版本中,TAnimal 和 TDog 类都有一个新方法: Voice(声音),它可以输出所选动物发出的声音,既可以是文本,也可以是声音。该方法在 TAnimal 类中被定义为虚方法,随后我们在定义 TDog 类时使用virtual和override关键字覆盖该方法:

typeTAnimal = classpublicfunction Voice: string; virtual;end;TDog = class(TAnimal)publicfunction Voice: string; override;end;

当然,这两种方法也需要被实现。这是一种简单的方法:

function TAnimal.Voice: string;
beginResult := 'AnimalVoice';
end;function TDog.Voice: string;
beginResult := 'ArfArf';
end;

​ 现在调用FMyAnimal.Voice有什么效果呢?这取决于当前对象的类型。如果FMyAnimal变量当前引用TAnimal类的对象,它将调用TAnimal.Voice方法。如果它引用TDog类的对象,它将调用TDog.Voice方法。这仅仅是因为该函数是虚函数。

​ 调用 FMyAnimal.Voice 将对 TAnimal 类的任何子类的实例对象有效,即使是在此方法调用后定义的或在其作用域之外的类。编译器不需要知道所有的子类就能使调用与它们兼容;只需要知道祖先类。换句话说,对 FMyAnimal.Voice 的调用与 TAnimal 未来的所有子类兼容。

​ 这就是为什么面向对象编程语言青睐可重用性的关键技术原因。你可以使用层次结构中的类编写代码,而不需要知道该层次结构中的具体类。换句话说,即使你已经编写了成千上万行代码,类层次结构和程序仍然是可扩展的。当然,有一个条件—层次结构中的祖先类需要精心设计。

Animals2 示例演示了这些新类的使用,其形式与前一示例类似。点击按钮即可执行该代码,显示输出并发出声音:

beginShow(FMyAnimal.Voice);MediaPlayer1.FileName := SoundsFolder + FMyAnimal.Voice + '.wav';MediaPlayer1.Play;
end;

注解:该应用程序使用MediaPlayer组件播放应用程序附带的两个声音文件(声音文件的名称与Voice方法返回的实际声音相匹配)。通用动物的一个相当随机的噪音,狗的一些吠叫声。现在,代码在Windows上很容易工作,只要文件在适当的文件夹中,但在移动平台上部署需要一些努力。查看实际演示以了解部署和文件夹结构是如何组织的。

这篇关于(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(延迟绑定和多态性)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866581

相关文章

基于@RequestParam注解之Spring MVC参数绑定的利器

《基于@RequestParam注解之SpringMVC参数绑定的利器》:本文主要介绍基于@RequestParam注解之SpringMVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助... 目录@RequestParam注解:Spring MVC参数绑定的利器什么是@RequestParam?@

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Mysql中InnoDB与MyISAM索引差异详解(最新整理)

《Mysql中InnoDB与MyISAM索引差异详解(最新整理)》InnoDB和MyISAM在索引实现和特性上有差异,包括聚集索引、非聚集索引、事务支持、并发控制、覆盖索引、主键约束、外键支持和物理存... 目录1. 索引类型与数据存储方式InnoDBMyISAM2. 事务与并发控制InnoDBMyISAM

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

StarRocks索引详解(最新整理)

《StarRocks索引详解(最新整理)》StarRocks支持多种索引类型,包括主键索引、前缀索引、Bitmap索引和Bloomfilter索引,这些索引类型适用于不同场景,如唯一性约束、减少索引空... 目录1. 主键索引(Primary Key Index)2. 前缀索引(Prefix Index /

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图