| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 299 人关注过本帖
标题:分享: 如何为自己对象设置一个只读属性
取消只看楼主 加入收藏
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
结帖率:96.49%
收藏
已结贴  问题点数:20 回复次数:3 
分享: 如何为自己对象设置一个只读属性
我们在写程序的时候往往会希望某个属性值不能被用户随意更改,但可以读取。
很可惜FoxPro不支持设计一个只读属性,要么保护,要么隐藏,可是一旦保护或隐藏了,就无法直接访问,只能通过内建的方法去访问这个值,挺麻烦的。
于是,我利用属性的assign方法设计了一个方法去模仿设立一个只读属性,完美解决这个问题。
首先,设置一个revisor属性,默认为空;
其次,通过一个方法来修改这个属性的值,只有这个方法才可以修改此属性的值;
最后,给需要设置为只读的属性分配一个assign方法,检查revisor的值,如果revisor是我们设定的那个方法,则修改它的值,否则拒绝;

演示代码实现如下:
程序代码:
clea
SET DATE TO long
otest=CREATEOBJECT('employee')
?[原来的hiredate:]
??otest.hiredate
otest.hiredate={^2022-12-01}
?[通过给otest.hiredate赋值修改日期为2022-12-01,但没有成功:]
??otest.hiredate
otest.sethiredate(DATE())
?[通过方法sethiredate()程序成功修改:]
??otest.hiredate

DEFINE CLASS employee AS CUSTOM
    *!*    HIDDEN HireDate
    *!*    PROTECTED HireDate
    First_Name = "Jiang"
    Last_Name = "Sam"
    Address = ""
    HireDate = {^2017-06-05} 
    revisor=[] &&用来判断修改者

PROCEDURE GetHireDate
  RETURN This.HireDate
ENDPROC

PROCEDURE hiredate_assign
PARAMETERS m.vnewval
m.voldval=this.hiredate

if strextract(this.revisor,[.],[])==UPPER([sethiredate])
*!*    检查revisor修改者是不是我们制定的方法    
    this.hiredate=m.vnewval
    this.revisor=[] &&恢复不可修改状态
ELSE
    this.hiredate=m.voldval
ENDIF

    
PROCEDURE sethiredate
    PARAMETERS hiredate
    this.revisor=PROGRAM() &&传递方法名给属性revisor
    this.hiredate=hiredate
    
ENDDEFINE


win7+foxpro9.0下 编译通过。
搜索更多相关主题的帖子: 属性 This 方法 修改 只读 
2024-04-05 22:04
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
hiredate_assign 有个bug,如果在一个多层次对象中,判断reivsor会出错,要修改一下。

PROCEDURE hiredate_assign
PARAMETERS m.vnewval
m.voldval=this.hiredate
n=occu([.],this.revisor)
if strextract(this.revisor,[.],[],n)==UPPER([sethiredate])

*!*    检查revisor修改者是不是我们制定的方法   
    this.hiredate=m.vnewval
    this.revisor=[] &&恢复不可修改状态
ELSE
    this.hiredate=m.voldval
ENDIF
2024-04-05 22:35
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 5楼 easyppt
最初也是简单设置个逻辑值来作开关阀,但是容易被用户更改这个开关,导致属性被修改,设置一个revisor之后,用户就不能更改这个值了,就算更改了,也不知触发的值是多少,除非他知道源代码。。。
2024-04-06 11:36
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 8楼 laowan001
封装类给别人使用,呵呵
2024-04-06 20:15
快速回复:分享: 如何为自己对象设置一个只读属性
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021774 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved