属性的概念
属性是用来描述一类事务得特征的,这种特征能够运行对象的可视化行为或者对他的操作。
类的属性大致分为两种:
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 之后新增的语法, 它解决了在同一单元私有成员不不保密的问题.