深圳做网站哪家公司好,做网站的公司深,网站建设色彩设计有什么用,视觉设计师工资一般多少第10章 属性和事件
在过去的三章中#xff0c;我已经介绍了Object Pascal中面向对象编程#xff08;OOP#xff09;的基础知识#xff0c;解释了这些概念并展示了大多数面向对象编程语言中通用特性是如何具体实现的。自Delphi的早期#xff0c;Object Pascal语言就是一…第10章 属性和事件
在过去的三章中我已经介绍了Object Pascal中面向对象编程OOP的基础知识解释了这些概念并展示了大多数面向对象编程语言中通用特性是如何具体实现的。自Delphi的早期Object Pascal语言就是一种完全面向对象的语言但具有其特有的风格。事实上它还充当了一个基于组件的可视化开发工具的编程语言。
这些并不是相互独立的特性对这种开发模型的支持基于一些核心语言特性如属性和事件最早在Object Pascal中引入然后被一些面向对象编程语言部分复制。例如属性可以在Java和C#等其他语言中找到但它们具有直接源于Object Pascal的渊源尽管我个人更喜欢原始实现不久后我将解释为什么。
Object Pascal之所以能够支持快速应用程序开发RAD和可视化编程是因为类似属性、“published访问修饰符、事件、组件概念以及本章中介绍的其他一些概念。这一开发模型通常使用属性-方法-事件模型”PME模型这一术语来描述它是RAD方法的具体实现。
10.1 定义属性
什么是属性属性可以被描述为标识符它们允许您访问和修改对象的状态可能会触发在幕后执行的代码。在Object Pascal中属性通过字段或方法抽象和隐藏数据访问使其成为封装的主要实现方式。可以用一种方式来描述属性那就是最大程度的封装。
从技术上讲属性是一个带有数据类型的标识符通过read和write说明符映射到某些实际数据。与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 从技术上讲您也可以省略读指令并定义一个只写属性但这通常没有太多意义而且极少使用。