经常见到这样定义一个属性:
private
Faa: integer;
public
aa: Integer read Faa write faa;
为什么要这样做呢,直接定义个共有变量不就行了吗?
public
aa: Integer;
说说有什么区别,最好举个例子什么情况下定义属性,有什么好处
private
Faa: integer;
public
aa: Integer read Faa write faa;
为什么要这样做呢,直接定义个共有变量不就行了吗?
public
aa: Integer;
说说有什么区别,最好举个例子什么情况下定义属性,有什么好处
类里的不应该叫变量,而是 field,也就是字段。
比如一个对象->人:
有年龄,性别,身高...等等属性
通过read,write方法对它范围进行限定,如:不能超过100岁,或者非男非女,或者身高是10米的...等
定义为变量问题就来了,范围不限定,这些数据表示出来还是人吗???
private
bb: integer;
public
aa: Integer read GetFaa write SetFaa;function ...GetFaa:integer;
begin
result :=bb;
end;procedure ...SetFaa(value :Integer);
begin
bb :=value;
end;
这就是为什么C++ 里面 动不动就用 Get 和 Set 来访问 m_变量.
类里的叫field、域或字段,
属性是间接了一层:允许加上读写方式限制、通过指定的读写过程进行访问
如果没任何限制,直接使用field就行了
比如一个人的年龄
你可以使用
var
age: integer;
这个变量表示,age := 100。设置这个人有100岁。
这样看着没有问题,但age := 1000呢?这样问题就体现出来了。 当你定义一个age属性如下
....
property Age: Integer read FAge write SetAge; 你可以在SetAge方法中这样处理
procedure SetAge(Value: integer);
begin
if (Value >= 0) and (value <= 100) then
FAge := Value
else
FAge := 100;
end;
让年龄的上限就在0~100岁,这样就灵活多了
(FAge就是成员变量,SetAge是修改FAge变量的方法;属性有Get方法提取数据,Set方法修改数据,在方法里面可以自己定义规则。
1:property最主要的用途是控制对成员的对写。由于你是通过read write来对成员的访问,所以你可以设置成只读,或可读写。另外,由于你可以设置成通过函数来访问成员,所以你能够在函数中添加更多的控制逻辑。2:可以通过一个数组属性 array property来达到对一组成员,或一个数组成员的访问3:property可以在继承中可以被重载override和rewrite。这里的override指的是可以改变stored属性,由父类中不允许被持久化,在子类中改为可以被持久化。rewrite指的是可以在子类中改变read write所指向的函数,从而改变属性的访问。4:property可以在继承树中改变访问域,即,父类中声明在protected的属性,可以在子类中改为public或published,但不改变属性的访问逻辑。5:声明在published部分的属性,可以被编译进RTTI中,从而实现对象的持久化,或运行期动态访问。就像你在IDE中看到的这些VCL对象一样。这个特性,使得Delphi远程对象访问,和控制反转等这些编程技巧得以实现。6:实现接口interface的委托。将对象声明中interface的实现,委托给一个属性。7:其他。:) 小的才疏学浅,未尽之处,还望补充。谢谢!
比如 你定义一个身高的变量 iHeight:Integer; (厘米为单位)哪天需要显示 米为单位
那么 就可以定义个 属性,对Iheight 变量进行 运算。