#2
sam_jiang2024-04-05 22:35
|
很可惜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下 编译通过。