(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(定义属性)

第10章 属性和事件

​ 在过去的三章中,我已经介绍了Object Pascal中面向对象编程(OOP)的基础知识,解释了这些概念并展示了大多数面向对象编程语言中通用特性是如何具体实现的。自Delphi的早期,Object Pascal语言就是一种完全面向对象的语言,但具有其特有的风格。事实上,它还充当了一个基于组件的可视化开发工具的编程语言。

​ 这些并不是相互独立的特性:对这种开发模型的支持基于一些核心语言特性,如属性和事件,最早在Object Pascal中引入,然后被一些面向对象编程语言部分复制。例如,属性可以在Java和C#等其他语言中找到,但它们具有直接源于Object Pascal的渊源,尽管我个人更喜欢原始实现,不久后我将解释为什么。

​ Object Pascal之所以能够支持快速应用程序开发(RAD)和可视化编程,是因为类似属性、“published"访问修饰符、事件、组件概念以及本章中介绍的其他一些概念。这一开发模型通常使用"属性-方法-事件模型”(PME模型)这一术语来描述,它是RAD方法的具体实现。

10.1 定义属性

​ 什么是属性?属性可以被描述为标识符,它们允许您访问和修改对象的状态,可能会触发在幕后执行的代码。在Object Pascal中,属性通过字段或方法抽象和隐藏数据访问,使其成为封装的主要实现方式。可以用一种方式来描述属性,那就是"最大程度的封装"。

​ 从技术上讲,属性是一个带有数据类型的标识符,通过readwrite说明符映射到某些实际数据。与Java或C#不同,在Object Pascal中,read和write说明符可以是获取器(getter)或设置器(setter)方法,也可以直接引用字段。

​ 例如,这是使用常见方法(直接从字段读取,通过方法写入)定义日期对象的属性的示例:

private FMonth : Integer;procedure SetMonth(value : Integer);
publicproperty Month : Integer read FMonth write SetMonth;

​ 要访问"Month"属性的值,这段代码必须读取私有字段FMonth的值。要更改该值,需要调用"SetMonth"方法。更改值的代码(以防止负值)可能如下所示:

procedure TDate.SetMonth(value : Integer);
beginif (value < = 0) or (value > 12) thenFMonth := 1elseFMonth := value;
end;

注意: 在出现不正确的输入情况,比如负月份数,通常最好显示一个错误(通过引发异常)而不是在幕后调整值,但出于简单的入门演示的考虑,我将保留代码不变。

​ 请注意,字段和属性的数据类型必须完全匹配(如果存在差异,可以使用简单的方法进行类型转换)。类似地,setter 过程的单个参数类型或getter函数的返回值必须与属性类型完全匹配。

​ 可以使用不同的组合(例如,我们也可以使用方法来读取值或在写指令中直接更改字段),但使用方法来更改属性的值是最常见的。以下是相同属性的一些替代实现:

property Month : Integer read GetMonth write SetMonth;
property Month : Integer read FMonth write FMonth;

注意: 当编写访问属性的相关的代码时,重要的是意识到可能会调用某一个方法。问题在于其中一些方法还需要一些时间来执行;它们也可能产生多种副作用,通常包括在屏幕上(慢速)重绘控件。尽管属性的副作用很少有文档记录,但您应该知道它们的存在,特别是当您尝试优化代码时。

​ 属性的写指令也可以省略,使属性成为只读属性:

property Month : Integer read GetMonth;

​ 从技术上讲,您也可以省略读指令并定义一个只写属性,但这通常没有太多意义,而且极少使用。

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

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

相关文章

科技云报道:大模型加持后,数字人“更像人”了吗?

科技云报道原创。 北京冬奥运AI 虚拟人手语主播、杭州亚运会数字人点火、新华社数字记者、数字航天员小诤…当随着越来越多数字人出现在人们生活中&#xff0c;整个数字人行业也朝着多元化且广泛的应用方向发展&#xff0c;快速拓展到不同行业、不同场景。 面向C端&#xff0…

C++实现四阶Runge-Kutta

#include <iostream>// 定义微分方程 dy/dx f(x, y) double f(double x, double y) {return 2 * x y; }// 四阶Runge-Kutta方法求解微分方程 double rungeKutta(double x0, double y0, double h, double xn) {double x x0;double y y0;while (x < xn) {double k1 …

.NET开源免费的跨平台框架 - MAUI(附学习资料)

前言 前几天分享了一个.NET MAUI开源免费的UI工具包 - Uranium&#xff0c;然后技术群有不少同学问.NET MAUI是不是免费的&#xff1f;能做什么&#xff1f;今天特意写这篇文章来介绍一下.NET开源、免费&#xff08;基于MIT License&#xff09;的跨平台框架&#xff1a;MAUI。…

PostCSS概述

PostCSS概述 在前端开发中&#xff0c;CSS预处理器和后处理器都是非常重要的工具。它们可以帮助我们写出更干净、可维护的CSS代码&#xff0c;同时还提供了许多强大的功能&#xff0c;如变量、混入(mixin)、嵌套等。其中&#xff0c;PostCSS就是一款强大的CSS后处理器。 一、…

Java并发体系--LinkedBlockingDeque

LinkedBlockingDeque LinkedBlockingDeque是Java中的一个双向链表阻塞队列&#xff0c;实现了BlockingDeque接口。它是一个线程安全的队列数据结构&#xff0c;可以同时支持在队列的头部和尾部进行元素的添加和删除操作&#xff0c;并且在队列为空或已满时提供阻塞操作。 Lin…

【刷题笔记】第八天

文章目录 [928. 尽量减少恶意软件的传播 II](https://leetcode.cn/problems/minimize-malware-spread-ii/)方法1&#xff1a;dfs方法2&#xff1a;并查集 [GCD and LCM](https://vjudge.net.cn/problem/Aizu-0005)[Missing Bigram](https://vjudge.net.cn/problem/CodeForces-1…

基于springboot+vue+Mysql的简历系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

数据赋能(60)——要求:数据服务部门能力

“要求&#xff1a;数据服务部门实施数据赋能影响因素”是作为标准的参考内容编写的。 在实施数据赋能中&#xff0c;数据服务部门的能力体现在多个方面&#xff0c;关键能力如下图所示。 在实施数据赋能的过程中&#xff0c;数据服务部门应具备的关键能力如下。 业务理解和沟…

案例与脚本实践:DolphinDB 轻量级实时数仓的构建与应用

DolphinDB 高性能分布式时序数据库&#xff0c;具有分布式计算、事务支持、多模存储、以及流批一体等能力&#xff0c;非常适合作为一款理想的轻量级大数据平台&#xff0c;轻松搭建一站式的高性能实时数据仓库。 本教程将以案例与脚本的方式&#xff0c;介绍如何通过 Dolphin…

MySQL 的事务

事务概念 MySQL事务是一个或者多个的数据库操作&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。 事务是通过事务日志来实现的&#xff0c;事务日志包括&#xff1a;redo log和undo log。 事务状态 事务有以下五种状态&#xff1a; 活动的部分提交的失败的中止的…

在win10中自定义文件夹右键菜单

在Windows 10中&#xff0c;右键点击文件夹空白区域可以快速访问一系列常用功能&#xff0c;如新建文件夹、粘贴、属性等。你可以根据自己的需求定制这个右键菜单&#xff0c;添加更多个性化的功能。本示例将向你展示如何在Windows 10中自定义文件夹右键菜单&#xff0c;让它更…

使用GAN做图像超分——SRGAN,ESRGAN

在GAN出现之前&#xff0c;使用的更多是MSE&#xff0c;PSNR,SSIM来衡量图像相似度&#xff0c;同时也使用他们作为损失函数。 但是这些引以为傲的指标&#xff0c;有时候也不是那么靠谱&#xff1a; MSE对于大的误差更敏感&#xff0c;所以结果就是会倾向于收敛到期望附近&am…

【深度学习】wandb模型训练可视化工具使用方法

【深度学习】wandb模型训练可视化工具使用方法 wandb简介功能介绍登陆注册以及API keysproject和runsproject和runs的关系 wandb的配置实验跟踪版本管理Case可视化分析可视化自动调参&#xff08;wandb.sweep&#xff09;配置wandb.sweep1.配置 sweep_config2.初始化 sweep con…

【python】flask中ORM工具SQLAIchemy,各种数据查询操作详细解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Python 密码学实用指南(全)

原文&#xff1a;zh.annas-archive.org/md5/fe5e9f4d664790ea92fb33d78ca9108d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 密码学在保护关键系统和敏感信息方面有着悠久而重要的历史。本书将向您展示如何使用 Python 加密、评估、比较和攻击数据。总的来说&…

Qt对话框

文章目录 创建普通的对话框对话框的内存泄露问题自定义对话框模态式对话框QMessageBox&#xff08;消息对话框&#xff09;对话框类型对话框按钮接收对话框返回值演示其他创建方式 QColorDialog&#xff08;颜色对话框&#xff09;案例 QFileDialog&#xff08;文件对话框&…

仿真测试的应用领域

仿真测试在各种领域中都有广泛的应用&#xff0c;以下是一些应用最广泛的场景&#xff1a; 工业制造&#xff1a;通过模拟制造过程&#xff0c;可以预测产品的质量和性能&#xff0c;优化生产流程&#xff0c;降低成本。航空航天&#xff1a;飞机、导弹、航天器等的设计和研发…

NiuShop单商户V5多门店版V5.3.6源码更新自定义表单

独立版&#xff1a;NiuShop单商户V5多门店、版本更新至V5.3.6&#xff0c;小程序、公众号版本&#xff0c;全插件&#xff0c;全开源&#xff0c;含微信公众号小程序&#xff1b;包更新&#xff0c;最新版更新了&#xff1a;新增&#xff0c;增加上传菜单权限 测试环境&#x…

Python - 字符串的应用

字符串格式化问题 使用规则举例: name input("请输入你的名字&#xff1a;") address input("请输入你的住址&#xff1a;") age int(input("请输入你的年龄&#xff1a;")) hobby input("请输入你的爱好&#xff1a;") # %s 字符…

【Android GUI】从总体上了解Android的GUI体系

文章目录 概览Android硬件接口HALGralloc与Framebuffer Gralloc模块的加载Gralloc提供的接口Android原生的Gralloc实现打开framebuffer设备打开gralloc设备 参考 概览 Linux内核提供了统一的framebuffer显示驱动。设备节点/dev/graphics/fb*或者/dev/fb*&#xff0c;其中fb0表示…