(delphi11最新学习资料) Object Pascal 学习笔记---第8章第1节(继承)

第8章 继承

​ 如果说编写类的关键原因是封装,那么在类之间使用继承的关键原因就是灵活性。将这两个概念结合起来,你就能拥有可以使用且不会改变的数据类型,并能创建这些类型的修改版本,这就是最初所谓的 “开放-封闭原则”:

“软件实体(类、模块、函数等)应该开放以进行扩展,但封闭以进行修改。”

​ ——Bertrand Meyer,《面向对象软件构造》,1988年

​ 诚然,继承是一种非常强的约束,会导致代码的紧密耦合,这是现在不推荐的做法,但继承也为开发人员提供了巨大的能力(是的,同时也带来了更多的责任)。

​ 在此,我不想就这一特性展开讨论,而是想向大家介绍类型继承的工作原理,特别是在 Object Pascal 语言中的工作原理。

8.1 从现有类型继承

​ 我们经常需要使用我们自己编写或别人给我们的现有类的略有不同的版本。

​ 例如,您可能需要添加一个新方法或对现有方法稍作修改。除非你想在不同情况下使用该类的两个不同版本,否则你可以通过修改原始代码来轻松实现。此外,如果该类最初是由其他人编写的(而你是从库中找到的),你可能希望将自己的修改分开。

​ 如果一个类有两个相似的版本,一种典型的老式方法是复制原始类型定义,修改代码以支持新特性,然后给生成的类取一个新名字。这种方法也许可行,但也可能带来问题:在复制代码的同时,也复制了错误;当其中一份代码中的错误被修复后,你必须记得将修复应用到另一份代码中;如果你想添加一个新特性,你需要添加两次或更多次,这取决于你随着时间推移所复制的原始代码的数量。即使在第一次编写代码时这样做不会拖慢您的速度,但这种方法对于软件维护来说却是一场灾难。此外,这种方法会导致两种完全不同的数据类型,因此编译器无法帮助您利用两种类型之间的相似之处。

​ 为了解决表达类之间相似性时出现的这类问题,Object Pascal 允许你直接从已有的类定义一个新类。这种技术被称为继承(或子类化,或类型派生),是面向对象编程语言的基本要素之一。

​ 要从现有类继承,只需在子类声明的开头注明该类即可。实际上,每次创建新窗体时,系统都会自动执行这一操作:

type
  TForm1 = class(TForm)
  ...
  end;

​ 这个简单的定义表示 TForm1 类继承了 TForm 类的所有方法、字段、属性和事件。您可以将 TForm 类的任何公共方法应用于 TForm1 类型的对象。反过来,TForm 又从另一个类继承了一些方法,依此类推,直到 TObject 类(它是所有类的基类)。相比之下,C++、C#和Java可能会使用类似以下的语法:

class Form1: TForm
{
...
}

​ 作为演示继承的一个简单示例,我们可以对上一章的 ViewDate 示例稍作修改,从 TDate 派生一个新类,并修改其中的一个函数 GetText。你可以在 DerivedDates 示例的 Dates.pas 文件中找到这段代码。

type
  TNewDate = class(TDate)
  public
    function GetText: string;
  end;

​ 在本例中,TNewDate 是派生自 TDate 的。通常可以说 TDate 是 TNewDate 的祖先类、基类或父类,而 TNewDate 是 TDate 的子类、后代类或子类。

​ 为了实现新版本的 GetText 函数,我使用了 FormatDateTime 函数,该函数使用(除其他功能外)预定义的月份名称。下面是 GetText 方法,其中 "dddddd"代表长日期格式:

function TNewDate.GetText: string;
begin
  Result := FormatDateTime('dddddd', FDate);
end;

​ 定义新类后,我们需要在 DerivedDates 项目的窗体代码中使用这种新数据类型。只需定义 TNewDate 类型的 ADay 对象,并在 FormCreate 方法中调用其自定义类型的构造函数即可:

type
  TDateForm = class(TForm)
  ...
  private
    FDay: TNewDate; // 更新声明
  end;

procedure TDateForm.FormCreate(Sender: TObject);
begin
  FDay := TNewDate.Create; // 更新行
  DateLabel.Text := FDay.GetText;
end;

​ 无需任何其他更改,新的应用程序就能正常运行。

​ TNewDate 类继承了增加日期、添加天数等方法。此外,调用这些方法的旧版代码仍可正常工作。实际上,要调用新版本的 GetText 方法,我们不需要修改源代码!Object Pascal 编译器会自动将调用绑定到一个新方法上。

​ 所有其他事件处理器的源代码完全保持不变,尽管其含义发生了很大变化,正如新的输出所演示的那样(见图 8.1)。

图8.1: DerivedDates程序的输出,其中月份和日期的名称取决于Windows区域设置

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

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

相关文章

Linux 系统 docker搭建LNMP环境

1、安装nginx docker pull nginx (默认安装的是最新版本) 2、运行nginx docker run --name nginx -p 80:80 -d nginx:latest 备注:--name nginx 表示容器名为 nginx -d 表示后台运行 -p 80:80 表示把本地80端口绑定到Nginx服务端的 80端口 nginx:lates…

c++|STL简介+string类的使用(常用接口)

目录 一、STL简介 1.1STL的版本 1.2STL六大组件 1.3STL的重要性及缺陷 二、string类简介 2.1string类了解 2.2为什么学习string类 三、string类使用(常用接口) 3.1string类的成员函数 3.1.1构造函数 3.1.2析构函数 3.1.3“”运算符重载函数 3.2迭代器(iterator)s…

免费使用Claude 3!这个平台集成了所有主流的AI聊天机器人!Poe AI 2024最新版教程

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

QT中的服务器与客户端

一、前言 本文主要讲讲QT中服务器与客户端的使用方法,QT已经封装好了,调用相应类直接访问即可。本文以QT中的QT中的TCP为例子,讲下使用方法以及线程中使用。 二、正文 2.1 Sever的使用方法 2.1.1 思路 QT中Sever使用的时候大致步骤为&…

《论文阅读》PAGE:一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023

《论文阅读》PAGE:一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023 前言 简介任务定义模型构架Utterances Encoding with EmotionPosition-aware GraphCausal Classifier实验结果 前言 亲身阅读感受分享,细节画图解释,再也不用担…

【QQ版】QQ群短剧机器人源码 全网短剧机器人插件

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 QQ版本可以兼容两个框架(HTQQ,MYQQ这两个的vip版也可以使用) 支持私聊与群聊,命令是 搜剧影视关键词 如果无法搜索到影视资源,请使用下方命令&…

【LVGL-键盘部件,实体按键控制】

LVGL-二维码库 ■ LVGL-键盘部件■ 示例一:键盘弹窗提示■ 示例二:设置键盘模式■ 综合示例: ■ LVGL-实体按键控制■ 简介 ■ LVGL-键盘部件 ■ 示例一:键盘弹窗提示 lv_keyboard_set_popovers(kb,true);■ 示例二:设…

Spring boot2.X 配置https

背景 最近项目组说要将 http 升级成 https 访问,证书也给到我们这边了,当然我们这边用的是个二级域名,采用的是通配符访问的方式,比如一级域名是这样(com.chinaunicom.cn),我们的则是&#xff0…

java数据结构与算法刷题-----LeetCode744. 寻找比目标字母大的最小字母

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 二分查找 二分查找 解题思路:时间复杂度O( l o g 2 …

vue2高德地图选点

<template><el-dialog :title"!dataForm.id ? 新建 : isDetail ? 详情 : 编辑" :close-on-click-modal"false" :visible.sync"show" class"rv-dialog rv-dialog_center" lock-scroll width"74%" :before-close&q…

神经网络:梯度下降法更新模型参数

作者&#xff1a;CSDN _养乐多_ 在神经网络领域&#xff0c;梯度下降是一种核心的优化算法&#xff0c;本文将介绍神经网络中梯度下降法更新参数的公式&#xff0c;并通过实例演示其在模型训练中的应用。通过本博客&#xff0c;读者将能够更好地理解深度学习中的优化算法和损…

五种方案图文并茂教你使用DBeaver,SQL文件导入数据库,插入数据,备份恢复mysql,postgres数据

文章目录 备份导出数据方案一&#xff1a;支持可以整个库导出、部分表导出、多个库导出&#xff08;可选格式较少&#xff09;使用连接数据库鼠标右键选择需要导出备份的数据库-工具-备份勾选需要导出的表-点击下一步设置输出目录和输出名称-点击开始导出成功 方案二&#xff1…

如何查看局域网IP?

在日常使用计算机和网络时&#xff0c;我们经常需要查看本地设备在局域网中的IP地址&#xff0c;以便进行一些网络配置或者连接其他设备。本文将介绍如何查看局域网中的IP地址&#xff0c;以及相关技术中的天联组网优势。 查看局域网IP 在Windows操作系统中&#xff0c;我们可…

Centos 配置JDK和Tomcat(新手版)

Centos 配置JDK和Tomcat&#xff08;新手版&#xff09; 1、安装JDK 如果原环境有jdk则需要卸载。 先用命令查看 rpm -qa|grep java 如果有jdk则需要卸载rpm -e --nodeps java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64rpm -e --nodeps java-1.8.0-openjdk-…

ClickHouse初体验

1.clickHouse是啥&#xff1f; ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS)&#xff0c;使用 C语言编写&#xff0c;主要用于在线分析处理查询(OLAP)&#xff0c;能够使用SQL查询实时生成分析数据报告 2.clickHouse的特点 2.1列式存储 对于列的聚合&…

web--文件下载,文件删除,文件读取

文件下载 看下载的地址 r不为空&#xff0c;所以传入donwload 下面的都能下载 实例 这样就会尝试下载1.zip 下载上一个目录的文件 包含了很多&#xff0c;里面可能就有配置文件 就是看到这种直接放文件上去 任意文件读取 得搜索特定函数&#xff0c;然后去源码找 找到调用的地…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(8)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云原生架构设计理论与实践&#xff08;7&#xff09; 所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本&#xff0c;对于云原生架构的…

JAVA的控制语句

控制语句 分为顺序、选择和循环 顺序结构 先执行a&#xff0c;再执行b 条件判断结构 如果......则....... 循环结构 如果.....则重复执行 条件判断结构&#xff08;选择结构&#xff09; if单分支结构 语法结构&#xff1a; if(布尔表达式){ 语句块 } 注&#xff…

极简wordpress网站模板

Pithy设计师wordpress网站模板 精练简洁的wordpress模板&#xff0c;设计师或设计工作室展示型网站模板。 https://www.jianzhanpress.com/?p6329

11.Notepad++

文章目录 一、下载和安装设置练习 以前在记事本上写的代码看上去有点累&#xff0c;因为所有的单词看上去都是黑色的&#xff0c;并且当代码出现问题后&#xff0c;它提示第三行&#xff0c;我们还需要一行一行去数。这些问题都可以由一个高级记事本&#xff1a; Notepad 来解…
最新文章