分享: 如何为自己对象设置一个只读属性
我们在写程序的时候往往会希望某个属性值不能被用户随意更改,但可以读取。很可惜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下 编译通过。