属性与变量的区别

lw19860412 2011-12-14 10:34:12
经常见到这样定义一个属性:
private
Faa: integer;
public
aa: Integer read Faa write faa;
为什么要这样做呢,直接定义个共有变量不就行了吗?
public
aa: Integer;
说说有什么区别,最好举个例子什么情况下定义属性,有什么好处
...全文
605 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
7年 2012-07-17
  • 打赏
  • 举报
回复
楼主如果看看JAVA的set,get就知道这2者的区别了
csdn小虫 2012-07-17
  • 打赏
  • 举报
回复
属性 可以是一个对变量复杂的操作
比如 你定义一个身高的变量 iHeight:Integer; (厘米为单位)

哪天需要显示 米为单位
那么 就可以定义个 属性,对Iheight 变量进行 运算。
蓝色光芒 2012-05-24
  • 打赏
  • 举报
回复
就楼主的例子来说,两者没区别
biololo 2012-05-23
  • 打赏
  • 举报
回复
我来总结一下property的适用范围(当然,在楼主所举例中,因为比较简单,确实看不出必要性)
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:其他。:) 小的才疏学浅,未尽之处,还望补充。谢谢!
gxgyj 2012-05-23
  • 打赏
  • 举报
回复
这就是面向对象
cdchq 2012-05-23
  • 打赏
  • 举报
回复
变量的话,你可以随便访问,修改
属性的话,你只能通过设定的方法来访问修改
jialiguo 2012-05-23
  • 打赏
  • 举报
回复
变量是数据的载体,一个对像的特性可以通过属性及方法表现,用属性表示对象更为灵活
比如一个人的年龄
你可以使用
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方法修改数据,在方法里面可以自己定义规则。
haitao 2011-12-17
  • 打赏
  • 举报
回复
变量是类之外的
类里的叫field、域或字段,
属性是间接了一层:允许加上读写方式限制、通过指定的读写过程进行访问
如果没任何限制,直接使用field就行了
schinar 2011-12-17
  • 打赏
  • 举报
回复
属性是成员函数(set)和过程(get).
chhrsas 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lw19860412 的回复:]

引用 1 楼 funxu 的回复:
属性是对变量的一种保护,例如可以只读,可以隐藏变量名,可以在赋值和取值时进行想要的操作等等
你的保护是不想让别人知道变量名吗?可是属性名不也出卖了变量名了么。如果赋值取值不需要多余的操作,也不考虑保护,那么用属性和变量是一样的喽?
[/Quote]
如果是你说的这种情况下,确实一样。不过如果想用到RTTI,还是有区别的。
类里的不应该叫变量,而是 field,也就是字段。
funxu 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lw19860412 的回复:]
引用 1 楼 funxu 的回复:
属性是对变量的一种保护,例如可以只读,可以隐藏变量名,可以在赋值和取值时进行想要的操作等等
你的保护是不想让别人知道变量名吗?可是属性名不也出卖了变量名了么。如果赋值取值不需要多余的操作,也不考虑保护,那么用属性和变量是一样的喽?
[/Quote]

谁规定的属性名要等于变量名?

人穿衣服和不穿衣服有什么区别呢?如果LZ说我穿个透明的塑料马褂不就等于不穿衣服吗?那还穿衣服干嘛呢?那我只能说,多看看书吧

lw19860412 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 funxu 的回复:]
属性是对变量的一种保护,例如可以只读,可以隐藏变量名,可以在赋值和取值时进行想要的操作等等
[/Quote]你的保护是不想让别人知道变量名吗?可是属性名不也出卖了变量名了么。如果赋值取值不需要多余的操作,也不考虑保护,那么用属性和变量是一样的喽?
funxu 2011-12-14
  • 打赏
  • 举报
回复
属性是对变量的一种保护,例如可以只读,可以隐藏变量名,可以在赋值和取值时进行想要的操作等等
try__again 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lw19860412 的回复:]

引用 1 楼 funxu 的回复:
属性是对变量的一种保护,例如可以只读,可以隐藏变量名,可以在赋值和取值时进行想要的操作等等
你的保护是不想让别人知道变量名吗?可是属性名不也出卖了变量名了么。如果赋值取值不需要多余的操作,也不考虑保护,那么用属性和变量是一样的喽?
[/Quote]
说到底属性也是一种封装,
除了说隐藏变量,只读保护等等之外,
当字段/变量有变化的时候,只需要修改属性的读写方法,而不需要大规模的修改程序做替换。
cntigercat 2011-12-14
  • 打赏
  • 举报
回复
属性可以对私有变量进行操作呀。。。
爱蹄子的羊头 2011-12-14
  • 打赏
  • 举报
回复
属性的好处很多的,,多写几次你就懂了..


这就是为什么C++ 里面 动不动就用 Get 和 Set 来访问 m_变量.
s11ss 2011-12-14
  • 打赏
  • 举报
回复
对,这种情况下直接定义共有变量确实更方便[Quote=引用楼主 lw19860412 的回复:]
经常见到这样定义一个属性:
private
Faa: integer;
public
aa: Integer read Faa write faa;
为什么要这样做呢,直接定义个共有变量不就行了吗?
public
aa: Integer;
说说有什么区别,最好举个例子什么情况下定义属性,有什么好处
[/Quote]
skap 2011-12-14
  • 打赏
  • 举报
回复
无聊的人你伤不起
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;
kaikai_kk 2011-12-14
  • 打赏
  • 举报
回复
用属性最大特点是表示出对像的特征来
比如一个对象->人:
有年龄,性别,身高...等等属性
通过read,write方法对它范围进行限定,如:不能超过100岁,或者非男非女,或者身高是10米的...等
定义为变量问题就来了,范围不限定,这些数据表示出来还是人吗???

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧