先理清现在的思路:平时要对属性Caption设置,一般是myForm1.Caption = "abc",没错。但现在因为要保护Caption属性,不让它被外部的过程访问,此时它对外部过程来说,是一个不存在的东西。那么我们要如何设置它呢?解决的办法,既然无法直接访问对象的属性,就让对象自己做,我们发号施令就行了,这个属性到底如何设置,我们是不管的。因此,对象给我们提供了一个可以访问的方法,叫SetCaption(),只要我们需要设置这个对象的Caption属性,就呼叫这个方法,给出参数,说我们希望表单的标题文字是"abc",对象收到这条指令,就自己去设置属性,我们的希望就达到了。这是间接访问的方式。
因为我们定义的表单类myForm,是一个设计模板,所有基于这个模板产生的对象实体,都具有设计蓝图所指出的特性,我们在设计时,给出了GetCaption()和SetCaption()这样两个方法,那么基于这个类的对象实体都具备这两个方法,都可以用。这正是我们所希望的类特征,设计一个类,就是让它具备我们希望有的一系列共同行为,模板就起这种作用。
在类定义中,你看代码,里面有一行Caption = "被保护的窗口标题",这个在类定义中书写的代码,才是批设置,每一个基于本类产生的对象实体,都默认其Caption是"被保护的窗口标题",这就是我们设计这类时赋予它的子孙的共同特征,省去创建时再设置的麻烦(如果不需要这样的特征,就不用写,但仍然有默认值,就是类名"myForm",这是从myForm的父类Form继承下来的)。
现在我们依据此类定义,创建了两个具体的表单,我们希望这两个表单有不同的标题,于是就对其中一个(即myForm2)进行了另外的设置,覆盖掉默认的标题,而myForm1则沿用默认的设置。在运行时,你看到效果确实如此。
是的,类定义的所有文字、代码,都不是实际的东西,但如果你创建了此类的对象实体,这些东西就会被“复制”到实体中去,就变成实际的东西了——每一个对象实体都分别复制一套这份代码。如果你从来没有创建过此类的对象实体,那么此类不会占用内存,等于虚无。
Show()是Form类设计的一个固有方法(凡是以Form为父类继承出来的子类,都继承有这个方法)。这个方法的作用是使Form(表单)显示为可见(其逆方法是Hide(),消隐表单)。Show()方法设计有可选的参数,如果参数是1,则此表单显示后,作为模式表单运行(与设置WindowType = 1等效),默认为0,是非模式表单。对方法,如果它不返回值,也没有参数,那么调用时可以不写圆括号,这就是我们平常写myForm1.Show的原因,如果要使用参数,就写完整格式Show(0)或Show(1)。
像Show、Hide、Refresh、Move这样你可能使用的表单方法,都是VFP设计好送给我们使用的,它有一套默认的动作,我们可以在子类定义中修改、补充、废弃那些代码,你平时用得最多的可能是Refresh。如果希望添加父类中没有的新属性、新方法,就必须像我们现在这样写类定义。