属性的概念
属性是用来描述一类事务得特征的,这种特征能够运行对象的可视化行为或者对他的操作。
类的属性大致分为两种:
1)普通的数据成员属性(类属性)
typeTForm1=Class(TForm)privateVclName:string;//这里就是普通的数据成员
2)可进行读写操作的属性(对象编辑器中显示的属性)
对属性值的修改会调用相应的属性设置方法。这类属性以property关键字为标识。
属性的访问
属性的访问是指再属性声明时设置对属性读和写操作的方法。这里是用read来标识属性的读方法,用write来标识属性的写方法。语法形式如下:
read数据成员名/方法名write数据成员名/方法名{read后面一般会跟一个和属性类型相同的变量用来读取属性的值write后面一般会跟一个固定格式的过程用来设置属性的值}
“数据成员名/方法名”,如果是成员名,那么这个数据成员必须与属性的类型相同。
这两个必须是已经声明了的,可以是当前类的(这两个名必须可见),也可以是父类的(至少是protected,不能是private)
示例
unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls;typeTForm1=class(TForm)Button1:TButton;procedureButton1Click(Sender:TObject);end;//TMyClass类里面包含两个属性(property)、两个方法、两个和TMyClass1相同的字段TMyClass=classstrictprivateFName:string;//类的字段必须放在属性和方法前面FAge:Integer;//字段以F开头,fieldprocedureSetAge(constValue:Integer);procedureSetName(constValue:string);publishedpropertyName:stringreadFNamewriteSetName;propertyAge:IntegerreadFAgewriteSetAge;end;{但这里的字段:FName、FAge和方法:SetAge、SetName是不能随便访问的,因为,它们在strictprivate区内,被封装了,封装后只能在类内部使用.属性里面有三个要素:1、指定数据类型:譬如Age属性是Integer类型;2、如何读取:譬如读取Age属性时,实际上读取的是FAge字段;3、如何写入:譬如希尔Age属性时,实际上是通过SetAge方法.属性不过是一个桥.通过属性存取字段和直接存取字段有什么区别?通过属性可以给存取一定的限制,譬如:一个人的age不可能超过200岁,也不会是负数;一个人的名字也不应该是空值.看implementation区TMyClass类的两个方法的实现,就增加了这种限制.}varForm1:TForm1;implementation{$R*.dfm}procedureTMyClass.SetAge(constValue:Integer);beginif(Value>=0)and(Value<200)thenFAge:=Value;end;procedureTMyClass.SetName(constValue:string);beginifValue<>''thenFName:=Value;end;//测试:procedureTForm1.Button1Click(Sender:TObject);varmyclass:TMyClass;beginmyclass:=TMyClass.Create;myclass.Age:=99;{通过TMyClass中的Age属性,只能赋一个合理的值}//class.FAge:=99;{TMyClass中的FAge字段被封装了,在这里无法使用}myclass.Free;//对象的释放。end;end.
strictprivate是Delphi7之后新增的语法,它解决了在同一单元私有成员不不保密的问题.
上一篇:IG现在这么穷了,赞助都拉不到
下一篇:《火焰纹章结合(ENGAGE)》全角色送礼指南 角色攻略方法一览
哈哈哈 子弹越打越多了
.
《刺客信条: 黑旗 记忆重置》回应DLC比本体贵: DLC非必须
当臭猫扶贫神秘嘉豪号主!
原神: 7.0奥黛塔定位反转! 并非木偶专属, 冰神设计成最大悬念
哪辆车能不被28吨钢卷压成废铁? 哪辆车能不被28吨钢卷压成废铁?
原神: 新超导木偶队顶配配装攻略! 告别刮痧与充能卡顿