属性的概念
属性是用来描述一类事务得特征的,这种特征能够运行对象的可视化行为或者对他的操作。
类的属性大致分为两种:
1)普通的数据成员属性(类属性)
type TForm1 = Class(TForm) private VclName : string; //这里就是普通的数据成员
2)可进行读写操作的属性(对象编辑器中显示的属性)
对属性值的修改会调用相应的属性设置方法。这类属性以property关键字为标识。
属性的访问
属性的访问是指再属性声明时设置对属性读和写操作的方法。这里是用read来标识属性的读方法,用write来标识属性的写方法。语法形式如下:
read 数据成员名/方法名 write 数据成员名/方法名 { read后面一般会跟一个和属性类型相同的变量用来读取属性的值 write后面一般会跟一个固定格式的过程用来设置属性的值 }
“数据成员名/方法名”,如果是成员名,那么这个数据成员必须与属性的类型相同。
这两个必须是已经声明了的,可以是当前类的(这两个名必须可见),也可以是父类的(至少是protected,不能是private)
示例
unit Unit1; interface uses Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; //TMyClass 类里面包含两个属性(property)、两个方法、两个和 TMyClass1 相同的字段 TMyClass = class strict private FName: string; //类的字段必须放在属性和方法前面 FAge: Integer; //字段以F开头,field procedure SetAge(const Value: Integer); procedure SetName(const Value: string); published property Name: string read FName write SetName; property Age: Integer read FAge write SetAge; end; { 但这里的字段: FName、FAge 和方法: SetAge、SetName 是不能随便访问的, 因为, 它们在 strict private 区内, 被封装了, 封装后只能在类内部使用. 属性里面有三个要素: 1、指定数据类型: 譬如 Age 属性是 Integer 类型; 2、如何读取: 譬如读取 Age 属性时, 实际上读取的是 FAge 字段; 3、如何写入: 譬如希尔 Age 属性时, 实际上是通过 SetAge 方法. 属性不过是一个桥. 通过属性存取字段 和 直接存取字段有什么区别? 通过属性可以给存取一定的限制, 譬如: 一个人的 age 不可能超过 200 岁, 也不会是负数; 一个人的名字也不应该是空值. 看 implementation 区 TMyClass 类的两个方法的实现, 就增加了这种限制. } var Form1: TForm1; implementation {$R *.dfm} procedure TMyClass.SetAge(const Value: Integer); begin if (Value>=0) and (Value<200) then FAge := Value; end; procedure TMyClass.SetName(const Value: string); begin if Value<>'' then FName := Value; end; //测试: procedure TForm1.Button1Click(Sender: TObject); var myclass: TMyClass; begin myclass := TMyClass.Create; myclass.Age := 99; {通过 TMyClass 中的 Age 属性, 只能赋一个合理的值} //class.FAge := 99; {TMyClass 中的 FAge 字段被封装了, 在这里无法使用} myclass.Free; //对象的释放。 end; end.
strict private是 Delphi 7 之后新增的语法, 它解决了在同一单元私有成员不不保密的问题.