(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)方法,也可以直接引用字段。

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

pascal 复制代码
private 
	FMonth : Integer;
	procedure SetMonth(value : Integer);
public
	property Month : Integer read FMonth write SetMonth;

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

pascal 复制代码
procedure TDate.SetMonth(value : Integer);
begin
	if (value < = 0) or (value > 12) then
		FMonth := 1
	else
		FMonth := value;
end;

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

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

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

pascal 复制代码
property Month : Integer read GetMonth write SetMonth;
property Month : Integer read FMonth write FMonth;

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

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

pascal 复制代码
property Month : Integer read GetMonth;

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

相关推荐
袁小皮皮不皮1 天前
1.HCIP BFD 学习笔记(优化版)
服务器·网络·笔记·网络协议·学习·智能路由器·ip
装不满的克莱因瓶1 天前
【自动驾驶领域】学习 Cityscapes 数据集——城市街景语义理解的标准基准
人工智能·pytorch·python·深度学习·学习·机器学习·自动驾驶
清辞8531 天前
产品经理需求推进流程
大数据·深度学习·学习·产品经理
YM52e1 天前
鸿蒙PC ArkTS 声明合并问题深度解析与最佳实践
学习·华为·harmonyos·鸿蒙·鸿蒙系统
海兰1 天前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
ken22321 天前
在 Libreoffice Calc中输入自定义表情字符时,需要保存之后,才能正常显示
学习
zwenqiyu1 天前
P5283 [十二省联考 2019] 异或粽子题解
c++·学习·算法
编程圈子1 天前
电机驱动开发学习2. 直流无刷电机工作原理
驱动开发·学习
MartinYeung51 天前
[论文学习]大型语言模型(LLM)安全与隐私-基于善、恶、丑的深度分析
学习·安全·语言模型
什仙1 天前
Mathcad Prime 的教程资料
学习·工具