属性与字段的区别? ( 积分: 50 )

  • 主题发起人 主题发起人 vivi0108
  • 开始时间 开始时间
V

vivi0108

Unregistered / Unconfirmed
GUEST, unregistred user!
刚学这个,很多概念不清楚,xdjm帮帮我啊!<br>属性与字段的区别?
 
“属性”一般是针对类或者对象来说的。比如说:你可以说“汽车”这个类具有“颜色”这个属性;<br>“字段”一般是针对数据库库表或者视图来说的。比如说:“物资库存表”这个数据库库表具有“库存量”这个字段。
 
最好能写个类能有属性和字段
 
to&nbsp;johnny&nbsp;du,<br>谢谢啊,不过我看的书上是写类里有三类元素,是字段,属性,方法,但就是没具体的例子,不怎么懂,你说的那个是针对不同的概念的,我就想字段delphi里类的区别。
 
TMan&nbsp;=&nbsp;class(TObject)<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;FAge:&nbsp;Integer;//字段<br>&nbsp;&nbsp;&nbsp;&nbsp;FIsBoy:&nbsp;Boolean;//字段<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;SetAge(const&nbsp;Value:&nbsp;Integer);//属性的写事件<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;Age:&nbsp;Integer&nbsp;read&nbsp;FAge&nbsp;write&nbsp;SetAge;//年龄属性<br>&nbsp;&nbsp;end;<br>implementation<br><br>procedure&nbsp;TMan.SetAge(const&nbsp;Value:&nbsp;Integer);<br>begin<br>&nbsp;&nbsp;//在设置年龄的时候,要进行基本的取值范围的判断<br>&nbsp;&nbsp;if&nbsp;(Value&nbsp;&gt;&nbsp;0)&nbsp;and&nbsp;(Value&nbsp;&lt;&nbsp;250)&nbsp;and&nbsp;(FAge&nbsp;&lt;&gt;&nbsp;Value)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;FAge&nbsp;:=&nbsp;Value;<br>end;
 
:)<br>楼上的已经写了例子了。<br>其实,类的私有数据叫做“字段”似乎不是很恰当。<br>我个人认为叫做“类的数据存储域”或者仿照C++中的叫法“类的数据成员”可能更合适些...
 
还没看过书上有属性的类声明。。。<br>不过那个age有什么用吗?方法里好象没用啊,如果没有age属性,那个声明不对吗?还有setage命名根据age来的?
 
区别难道在于private和public?
 
呵呵:)看来楼主似乎对OOP还没有入门。<br>是这样的:<br>private关键字是说明在该部分声明的变量(如:FAge)或函数(如:SetAge)只有类自己才能够访问,而且同一类的不同实例也不能访问;<br>public关键字是说明在该部分声明的变量或函数,可以被大家共同访问。<br>还有一个关键字就是published,一般属性放在published关键字下,也就是当类被注册到IDE中后可以在ObjectInspector中显示对象属性的部分。<br>royal1442大侠的例子没有错,他的例子是说类TMan的FAge数据成员是通过属性Age的SetAge方法进行设置的。<br>这样做的好处是:你可以不改变类的属性调用方法而改变类属性的访问限制。<br>举个例子来说,就是你可以将SetAge的实现方法改为:<br>procedure&nbsp;TMan.SetAge(const&nbsp;Value:&nbsp;Integer);<br>begin<br>&nbsp;&nbsp;//在设置年龄的时候,要进行基本的取值范围的判断<br>&nbsp;&nbsp;if&nbsp;(Value&nbsp;&lt;&nbsp;18)&nbsp;or&nbsp;(Value&nbsp;&gt;&nbsp;60)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('不是合法的员工年龄');<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;FAge&nbsp;:=&nbsp;Value;<br>end;&nbsp;&nbsp;<br>这样你就可以提高该类的可维护性,当然不能改变类的该属性的接口定义。
 
是啊,刚学。<br>to&nbsp;johnny:你的那句“你可以不改变类的属性调用方法而改变类属性的访问限制”,不怎么明白,能不能解释下?
 
就是说在royal1442所举的例子中你可以给TMan类实例的Age属性赋0到250间的任何值;<br>而在我修改后的例子中你仅仅能够给该属性赋18到60之间值。
 
好象是给字段fage赋值啊,怎么给属性age赋了?大侠解释下啊,我晕了。。。。。
 
是这样的,确实,实际上对Age的赋值最后会映射到对数据成员FAge的值改变上。但是从整个类的外表来看确实对属性Age进行赋值的。这点正是OOP的优越性之一,就是你不能够对类的私有数据成员进行直接的访问,而只能够通过该属性的接口访问该成员。这样就在最大程度上保护了类的私有数据成员的安全性。<br>举个不很恰当的例子来说吧,我们并不是为了吃饭而吃饭的,而是为了长身体和各种运动积蓄能量而吃饭的。可是我们并不是通过直接在身体上注射能量物质来来完成这一过程的(尽管从某种程度上来说这可能是最有效和最快捷的能量获取方式了),而是通过吃我们所需要的食物来获取的。尽管这样见效可能慢些,但是这是最安全的方式,而且我们可以通过吃不同的东西来使自己的身体获得所需要的能量或微量元素,只要它的获取接口不变(呵呵,就是我们的嘴巴了)。<br>不知道我这么说,是否楼主明白了一下呢?
 
有点开窍了,谢谢johnny大侠!
 
age是在属性面板上的,相当与label的caption,给age赋值就相当于调用setage方法给fage字段赋值,这样理解对吗?johnny大侠!
 
对你说的没错,就是这样理解。<br>下面是我写的给你的一个示例类的代码,供你参考。<br><br>unit&nbsp;ClassExample;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;SysUtils,&nbsp;Dialogs;<br><br>type<br>&nbsp;&nbsp;TSex&nbsp;=&nbsp;(Male,Female);<br>&nbsp;&nbsp;{***********************************************************************<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里声明一个THuman的类。这个类有三个属性,分别是:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Race属性,该属性是一个既有写方法也有读方法的属性。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而且该属性仅能够设置为Chinese或USA这两个值,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在读取该属性时,若FAge数据成员没有赋值,则<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回未赋值信息;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Age属性:该属性有一个写方法,且仅能够对该属性赋0~150之间的值;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sex属性:该属性既没有读方法,也没有写方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过仅能够对其赋Male或Female其中之一的值。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后,该类还有一个构造函数用于为该类实例设置Age与Sex的缺省值<br>&nbsp;&nbsp;&nbsp;**********************************************************************}<br>&nbsp;&nbsp;THuman&nbsp;=&nbsp;class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//声明一个人类<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;FRace:&nbsp;String;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//人的种族<br>&nbsp;&nbsp;&nbsp;&nbsp;FAge:&nbsp;Integer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//人的年龄<br>&nbsp;&nbsp;&nbsp;&nbsp;FSex:&nbsp;TSex;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//人的性别<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetRace:&nbsp;String;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//种族的读取方法<br><br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;SetRace(const&nbsp;aRace:&nbsp;String);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//种族的设定方法<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;SetAge(const&nbsp;anAge:&nbsp;Integer);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//年龄的设定方法<br><br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;constructor&nbsp;Create;&nbsp;overload;<br>&nbsp;&nbsp;published<br>&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;Race:&nbsp;String&nbsp;read&nbsp;GetRace&nbsp;write&nbsp;SetRace;&nbsp;&nbsp;&nbsp;//既有写方法,也有读方法的属性<br>&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;Age:&nbsp;Integer&nbsp;read&nbsp;FAge&nbsp;write&nbsp;SetAge;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//只有写方法的属性<br>&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;Sex:&nbsp;TSex&nbsp;read&nbsp;FSex&nbsp;write&nbsp;FSex;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//既没有写方法,也没有读方法的属性<br>&nbsp;&nbsp;end;<br><br>implementation<br><br>constructor&nbsp;THuman.Create;<br>begin<br>&nbsp;&nbsp;inherited;<br>&nbsp;&nbsp;FAge&nbsp;:=&nbsp;20;<br>&nbsp;&nbsp;FSex&nbsp;:=&nbsp;Male;<br>end;<br><br>function&nbsp;THuman.GetRace:&nbsp;String;<br>begin<br>&nbsp;&nbsp;if&nbsp;FRace&nbsp;=&nbsp;''&nbsp;then<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;'Have&nbsp;no&nbsp;Race!'<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;FRace;<br>end;<br><br>procedure&nbsp;THuman.SetRace(const&nbsp;aRace:&nbsp;String);<br>var<br>&nbsp;&nbsp;strTmp:&nbsp;String;<br>begin<br>&nbsp;&nbsp;strTmp&nbsp;:=&nbsp;Trim(aRace);<br>&nbsp;&nbsp;if&nbsp;((strTmp&nbsp;=&nbsp;'Chinese')&nbsp;or&nbsp;(strTmp&nbsp;=&nbsp;'USA'))&nbsp;then<br>&nbsp;&nbsp;FRace&nbsp;:=&nbsp;strTmp<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;ShowMessage('Not&nbsp;a&nbsp;legal&nbsp;Race!');<br>end;<br><br>procedure&nbsp;THuman.SetAge(const&nbsp;anAge:&nbsp;Integer);<br>begin<br>&nbsp;&nbsp;if&nbsp;(anAge&nbsp;&lt;&nbsp;0)&nbsp;or&nbsp;(anAge&nbsp;&gt;&nbsp;150)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('Not&nbsp;a&nbsp;legal&nbsp;Age!');<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;end;<br>end;<br><br>end.
 

Similar threads

后退
顶部