1、Visual FoxPro,1,第十章,面向对象程序设计基础,Visual FoxPro,2,10.1 面向对象的概念 10.2 Visual FoxPro的面向对象支持 10.3 面向对象的程序设计方法,Visual FoxPro,3,10.1.1 对象与类 在面向对象程序设计(Object Oriented Programming,简称为OOP)中,对象(Object)是组成程序的构件,就好象在面向过程的结构化程序设计方法(Structured Programming)中的子程序和函数的作用一样。在结构化程序设计方法中,程序设计人员把一个待求解的问题自顶向下进行分解,以便形成一个个相对简单
2、独立的子问题,然后用子程序或函数来解决这些子问题,用子程序或函数之间的数据通信来模拟这些子问题间的联系,最后把这些子程序或函数装配起来以形成解决问题的完整程序。,10.1 面向对象的概念,Visual FoxPro,4,在面向对象的程序设计方法中,程序设计人员不是完全按过程对求解问题进行分解,而是按照面向对象的观点来描述问题、分解问题,最后选择一种支持面向对象方法的程序语言来解决问题。在这种方法中,设计人员直接用一种称之为“对象”的程序构件来描述客观问题中“实体”,并用“对象”间的消息来模拟实体间的联系,用“类”来模拟这些实体间的共性。,Visual FoxPro,5,1.对象(Object)
3、 在OOP方法中,作为程序构件的“对象”是对现实世界中一个实体的一种模拟工具。例如如要设计一个某高校学生学籍管理软件,所涉及到的实体包括“学生”、“课程”、“专业”等等。要模拟一个活生生的学生,需要使用一组特征数据(如姓名、籍贯、性别、身高、年龄等等)和一组行为规则(如该生对待某些外部事件的反映:受到表彰会怎样反映、受到批评会怎样反映、受到屈辱会怎样反映、遇到同学的困难时会怎样反映等)来模拟其静态特征和动态特征。,Visual FoxPro,6,OOP方法正是用一组称为“属性”的数据模拟所描述实体(如学生)的静态特征、而用一组称为“方法程序”的程序过程模拟该实体对一些“事件”(如受到学校嘉奖)
4、的反映。把模拟一个实体的“属性”数据和“方法程序”通过一定的形式进行“封装”就建立起了一个OOP方法中的对象。 当然,如果对被管理的成千上万个学生都这样一个个完全独立地设计“程序对象”,其工作量将会大得惊人,这实际上是不可能的。OOP方法中,通过另一种称为“类”的工具对这一问题给出了一个巧妙的解决办法。,Visual FoxPro,7,2.类(Class) “类”是具有相同属性特征和行为规则的多个“对象”的一种统一描述。对于一个学校的全体学生,描述其特征的数据模式是相同的(当然不同“对象”的特征值会有不同)。行为规则有不同的地方,也有相同的地方。如果我们侧重于描述每个个体对一些诸如观看球赛、对
5、待他人遇到意外事件的反映等等,不同个体间的反映可能很不相同,描述其反映的“方法程序”也许无法共享。但如果将行为的选择加以一些限制,将引起学生反映的外部事件归纳为:,Visual FoxPro,8,(1)一个新学年度到来时,学生的整体反映应该是缴费报导。 (2)当一个学年度不及格科目超过学校规定时,这一部分学生应该留级或退学。 (3)完成规定科目的学习并考试合格者,学生的整体反映是毕业离校。 在一般管理信息系统中,系统的使用者和设计者所关心的问题正是这样一些共性问题而并非一些很个体的问题,这样设计者就可以对个体的行为进行分析、归纳、抽象,形成整个群体的共同行为规范,并把这种共同的行为规范用程序设
6、计语言描述成程序过程,和描述该群体的特征数据模式一起进行封装,这样就完成了OOP方法中一个“类”的设计。,Visual FoxPro,9,在OOP方法中,“类”是对现实世界的一种高度抽象与概括,而“对象”则是“类”的一个实例,“对象”一定具有其属“类”的共同特征与行为规则,当然一个“对象”还可以具有其属“类”未曾规定的特征和行为规则。这一点和现实生活是非常相同的,这样的模拟和抽象比较符合人们的思维习惯,这也正是OOP方法具有强大生命力,能够获得越来越多的软件工作者欢迎并得到众多计算机开发商支持的一个基本原因。 总之,从程序设计者的角度观察,“类”是一个数据模式和若干个程序过程(称为“方法程序”
7、、一般一种行为用一个程序过程描述)经封装而形成的一个整体,它是使用信息技术对现实世界的一种模拟与抽象,而“对象”则是“类”的一个实例,用程序设计语言来说,“对象”可以不精确的理解为对一个“类”赋值的结果。“对象”是OOP方法中组成程序一种构件。,Visual FoxPro,10,3.事件与响应 “事件”是由外部实体作用在“对象”上的一个动作。在现实生活中,某人出生、死亡、其电话震铃、设定的闹钟响了以及过生日又长了一岁等等都称为一个事件,人们都会对这些事件做出一定的反映:如电话震铃就要接听电话、设定的闹钟响了可能就要去干一件什么事情,而过生日后可能要入学了等等。在OOP方法中,作用在“对象”上的
8、事件包括对象的创立、释放、收到其他对象发来的“消息”等,对于一些可视对象,如命令按钮等,其最常见的“事件”往往是一些鼠标动作,如“单击”、“双击”、“拖放”或修改对象数据等等。当作用在对象上的某个设定“事件”发生时,与该事件相联系的“方法程序”(当然假设对象的设计者设计了该程序并与对象一同封装)就运行并完成该程序的功能。OOP就用这种机制来模拟对象对外部事件的反映并进而完成由外部事件序列所规定的功能。,Visual FoxPro,11,4.事件代码与方法代码 事件代码与方法代码都是定义在某个对象中的一个程序过程,有时也把两者统称为方法代码。但狭义地说:事件代码可以由一个“事件”触发运行,其过程
9、名与事件名相同,而一般方法程序没有一个与之对应的事件触发,必须靠其他程序调用才能得以运行。因为不能为对象建立新的事件,所以一个对象包含的事件代码是一定的,不能增加,而一个对象中所包含的方法代码是可以任意增加的,就象在一个程序中可以使用任意多个过程和函数一样。,Visual FoxPro,12,10.1.2 子类与继承 既然“类”是OOP方法中对现实世界进行模拟与抽象的一种工具,而现实世界中的类是分层次的,有大类、中类、小类之分,如人类是地球上所有人的总属类,在这个大的属类中,按肤色可进一步分为黄种人、白种人、黑种人等,不同肤色的人除具有人类这样一些共同的特征外,还具有某个肤色的人种所独有的特征
10、,在对人类进行研究时,如果不注意这些不同的特征,研究就难以深入。OOP方法中,用“子类”来模拟现实世界中的类的层次问题。,Visual FoxPro,13,如果设计一个“类”CLASS_STUDENT来模拟华中大学全体学生组成的集合后,还可以以CLASS_STUDENT类为基础来设计一个“子类” CLASS_STUDENT_COMPUTER来模拟华中大学计算机系的学生。从现实生活中说,华中大学计算机系的学生应该具有其属类华中大学的学生的全部特征和行为规则,同时还具有这个系的学生独有的东西,在OOP方法中正是完全模拟了这一点,以CLASS_STUDENT“类”为基础建立的“子类” CLASS_S
11、TUDENT_COMPUTER会完全继承CLASS_STUDENT“类”的全部数据模式和“方法程序”,并且可以对这些数据模式和方法程序进行修改。这里,“类”STUDENT_COMPUTER称为“类”CLASS_COMPUTER的“子类”,而CLASS_COMPUTER称为CLASS_STUDENT_COMPUTER“父类”。在OOP方法中,“子类”将继承其“父类”的全部特征和方法程序,当然,在“子类”中可以对这些继承的特征和方法程序进行修改以对该“子类”进行更准确的模拟。,Visual FoxPro,14,注意,在上面反复说“子类”继承其“父类”的全部特征模式和方法程序而不说成拷贝其“父类”的
12、特征和方法程序是因为这样一个事实,当对“父类”进行修改后,这种修改会立即反映到所有以该“父类”为基础而建立的全部“子类”中,不管这些“子类”是在“父类”修改前还是修改后建立的。 “子类”对“父类”的继承如此,以一个“类”为基础建立的“对象”对所属“类”的继承也是如此。,Visual FoxPro,15,如前所述,当建立了“父类”CLASS_STUDENT和其“子类”CLASS_STUDENT_COMPUTER后,如果要建立一个“对象”Object_Student来模拟计算机系的某个学生,可以用两种不同的方法来实现: (1)以CLASS_STUDEN“类”为基础建立“对象”Object_Stud
13、ent。 (2)以CLASS_STUDENT_COMPUTER“类”为基础建立“对象”Object_Student。 从前面的分析中读者很容易判断,第二种方法建立的对象Object_Student应该对计算机系的学生有更准确更完整的模拟。,Visual FoxPro,16,10.2.1 Visual FoxPro 6.0 的类 如前所述,组成OOP程序的基本构件是“对象”,而对象是由“类”派生的,因此,把一个待求解问题进行分析、归纳、抽象,进而用“类”这种工具对问题模拟,并采用程序设计语言来完成“类”的设计就是OOP方法的一项重要工作。为方便从事应用开发的软件设计人员,一般支持OOP方法的计算
14、机语言都提供了丰富的基本类(称为基类)供用户直接使用。开发人员可以根据这些基类而派生自己的子类以对具体问题进行更准确的模拟,也可以直接根据基类而派生“对象”。图10.1给出了Visual FoxPro 6.0中为用户提供的基类。在第11章会详细说明这些“基类”的作用和用法。,10.2 Visual FoxPro 6.0 对面向对象方法的支持,Visual FoxPro,17,图10.1,Visual FoxPro,18,现代应用系统一般都采用微软公司推荐的Windows 界面,界面上面是菜单栏,用户可以方便地选择所需要的功能;主窗口是数据交互窗口,用来输入问题的状态信息,报告问题的处理结果;而
15、在主窗口下面或右侧一般是一组命令按钮,供用户指示应用系统的操作步骤;为方便用户的数据录入,有时还有一些单选按钮、复选框、微调按钮等等。在OOP方法中,这些都被称为“对象”,而 Visual FoxPro 6.0 为这些应用系统常用的对象提供了相应的模板“基类”,当应用系统的开发者对于这些“基类”进行了足够的了解后,就能在自己的开发工作中方便自如地使用它们,根据应用需求对它们进行改造(这里的“改造”并不是修改Visual FoxPro 6.0系统中所带的这些“基类”,而是根据这些“基类”派生“子类”,即进行“子类”的设计工作)后形成“子类”或直接形成“对象”,可以极大地提高开发工作效率,增加系统
16、的可靠性。,Visual FoxPro,19,也许觉得应用这些“基类”难于模拟现实生活中的一些客观事物的状态与行为特征,如怎样模拟一个学生的基本状态(如姓名、年龄、专业等)和其主要行为特征(注册、登录课程成绩、毕业离校等)。实际上,进行这些具体事物的模拟是要用Visual FoxPro 6.0所提供的“基类”进行有效地组合才能实现的,学生的基本状态是用一组数据来描述的,设计者可以使用Visual FoxPro 6.0 中所提供的表格“类”或一组文本框“类”来模拟这组状态,而针对学生的“注册”、“成绩登录”和“毕业离校”的每项工作可以用命令按钮类来模拟,把这些文本框(或表格)和一组命令按钮包装到
17、一个根据Visual FoxPro 6.0的“基类”表单或容器而派生的“子类”中,就完成了模拟学生这一群体的子类设计工作。,Visual FoxPro,20,10.2.2 容器与控件 1容器类 容器类可以包含其他对象,并且允许访问这些对象。例如,若创建一个含有两个列表框和两个命令按钮的容器类,而后将该类的一个对象加入表单中,那么无论在设计时刻还是在运行时刻,都可以对该容器中任何一个对象进行单独操作。不仅可以改变列表框的位置和命令按钮的标题,也可以在设计阶段给这个容器添加新对象。例如,可以给列表框加标签,来标明该列表框。,Visual FoxPro,21,2.控件类 控件类的封装比容器类更为严密
18、,但也因此丧失了一些灵活性。控件类没有 AddObject 方法程序。在该“类”中不能包含其他类,最典型的控件类就是命令按钮。容器类虽然在引用时可以视为一个整体,但无论是在设计阶段还是在运行阶段,其所包含的对象都是可以识别并可以单独操作的。,Visual FoxPro,22,容器类和控件类的比较,Visual FoxPro,23,3.容器中各对象的调用 在进行容器类“子类”或“对象”的设计时,往往要调用容器中某一特定对象,这就要掌握OOP方法中对象的标识方法。首先要明确下面几个问题: (1)容器类中对象的层次 容器中的对象仍然可以是一个容器,一般把一个“对象”的直接容器称为“父容器”,在调用特
19、定的对象时,搞清该对象的“父容器”是至关重要的,不能把一个对象的间接容器错误地视为其“父容器”。,Visual FoxPro,24,(2)对象使用局域名 每个对象都有一个名字。在给对象命名时,只要保证同一个“父容器”下的各对象不重名即可,换句话说,对象使用的是局域名,因此不能单独使用对象名来调用对象,对象调用的一般格式是: Object1.Object2 Object1、Object2是对象名字,其中Object1 是 Object2 的“父容器”,这种格式所表示的是Object2 而非Object1,“对象”与其“父容器”间用一个小数点(.)分隔。,Visual FoxPro,25,(3)几
20、个代词的用法 在进行对象调用时,有几个经常使用的代词,应理解其含义并能熟练应用。 This表示对象本身 Parent表示对象的“父容器”对象 ThisForm表示对象所在的表单 ThisFormSet表示对象所在的表单所属的表单集,Visual FoxPro,26,10.2.3 事件与方法 1OOP方法中的事件 如前所述,在OOP方法中,“事件”是驱动蕴涵在对象中的程序的的引擎,一个事件有一个事件名,一个事件与一个事件响应程序(方法程序)相关联,当作用在一个对象上的事件发生时,与这个事件相关联的程序就获得一次运行。 在一种程序设计语言中,每种对象所能识别的事件是固定的,也就是说,开发者不能自己
21、规定一个对象不能识别的事件并设计一段与该事件相联系的程序,这样即算该事件发生了,由于对象不能识别,因而也就无法触发程序并使之运行。,Visual FoxPro,27,2.OOP方法中对象对事件的反映 当作用在对象上的一个事件发生时,若没有与之相关联的代码,则不会发生任何操作。对于绝大多数事件,开发者都不必编写代码,实际上只需对少数几个系统中要用到的事件设计响应程序即可。 事件的响应程序过程一般是一个过程,用事件的名称来命名。 一段事件响应代码应置于何处,是由事件发生的顺序决定的。请注意: 表单中所有对象的 Init 事件将在表单的 Init 事件之前执行,所以在表单显示以前,就可在表单的 In
22、it 事件代码中处理表单上的任意一个对象。,Visual FoxPro,28,若要在列表框、组合框或复选框的值改变时执行某代码,可将它编写在 InteractiveChange 事件(不是 Click 事件)中,因为一般而言,对象的值的改变并不触发对象的Click 事件,有时对象的值没改变,而 Click 事件却会发生。 当拖动一对象时,系统将忽略其他鼠标事件。例如,在拖放操作中 MouseUp 和 MouseMove 事件不会发生。 Valid 和 When 事件有返回值,默认为“真”(.T.)。若从 When 事件返回“假”(.F.) 或 0,对象将不能被激活。若从 Valid 事件返回“
23、假”(.F.) 或 0,不能将焦点从对象上移走。,Visual FoxPro,29,3.方法程序的层次 (1)容器事件和对象事件 为对象编写事件代码时,应注意以下两条基本规则: 容器不处理与所包含的对象相关联的事件。 若没有与某对象相关联的事件代码,则 Visual FoxPro 在该对象所在类的层次结构中逐层向上检查是否有与此事件相关联的代码。 当用户以任意一种方式(使用 Tab 键、单击鼠标、将鼠标指针移至对象上等)与对象交互时,对象事件被触发。每个对象只接收自己的事件。例如,尽管命令按钮位于表单上,当用户单击命令按钮时,不会触发表单的 Click 事件,只触发命令按钮的 Click 事件
24、。,Visual FoxPro,30,容器事件代码与其所包含的对象事件代码相互独立。 若没有与命令按钮相关联的 Click 事件代码,尽管有与表单相关联的 Click 事件代码,当用户单击按钮时,也不会执行与表单相关联的 Click 事件代码。 这条规则也适用于表格控件。表格包含列,列又包含标头和文本框。当事件发生时,只有与事件相关联的最底层对象识别该事件,高层的容器不识别这个事件。图10.6说明当用户在表格上移动鼠标时,哪个对象处理这个 MouseMove 事件,Visual FoxPro,31,表格对象上的事件,Visual FoxPro,32,这条规则对于按钮组对象或命令组对象有一个例外
25、。如果为选项按钮组或命令按钮组编写了某事件代码,而组中个别对象没有与该事件相关联的代码,当这个对象上的事件发生时,将执行容器组的事件代码。 例如,有一个选项按钮组,在它的 Click 事件中包含了相关的代码,而在选项按钮组的两个选项按钮中只有Option1 按钮拥有与 Click 事件相关联的代码。 当用户单击 Option1 时,与其相关联的 Click 事件代码被执行,不执行与按钮组相关联的 Click 事件代码。而用户单击Option2,因为没有与其相关联的 Click 事件代码,系统将执行选项按钮组的事件代码。,Visual FoxPro,33,包含两个对象的选项按钮组,Visual
26、FoxPro,34,当连续发生一系列事件时(比如 MouseDown 事件后面接着发生 MouseUp 事件),若起始事件与某个控件相关联,那么整个事件队列都将属于这个控件。 例如,在一个命令按钮上,按下鼠标主按扭并拖动鼠标指针离开命令按钮,尽管鼠标指针可能已在表单上,这个命令按钮的 MouseMove 事件还是不断产生。当在表单上而不是在命令按钮上释放鼠标主按扭时,发生的 MouseUp 事件是与命令按钮相关联,而不是与表单相关联。,Visual FoxPro,35,(2) 对象方法的继承层次 前面所讲的编写事件代码的第二条原则实际上是讲的对象对其“父类”或“父类”的“父类”的事件代码继承问
27、题,基本规则是: 若某个对象基于一个用户子类(同样地,这个类本身也可能基于其他用户子类),当一个事件在该对象上发生时,Visual FoxPro 首先在该对象中查看是否有与此事件相关联的代码。若找到,则执行它;否则,Visual FoxPro 将在类层次中向上逐层检查。无论 Visual FoxPro 在类层次的哪个地方找到该事件代码,都执行它,而该层以上的代码将不会被执行。,Visual FoxPro,36,按继承关系寻找对象的事件代码,Visual FoxPro,37,应该清楚: 当某事件在一个对象上发生后,Visual FoxPro只是从该对象开始向上寻找到与该对象的继承关系最近的类的事
28、件代码执行,这意味着,当为某一个子类或对象设计一个事件响应程序后,该对象(或子类)的“父类”上原来定义的相应代码将变得无效,永远没有执行机会。如果只希望在原来的代码中增加一些功能,则必须在自定义代码中插入一个语句: DODEFAULT() 该语句表示执行执行原代码功能。,Visual FoxPro,38,10.3.1 类的设计 1.用程序方法设计类 可以象设计其他程序一样在。prg程序文件中设计开发者自己的“子类”,设计类的语句格式是: DEFINE CLASS ClassName1 AS ParentClass OLEPUBLIC PROTECTED | HIDDEN PropertyNam
29、e1, PropertyName2 . Object.PropertyName = eExpression . ADD OBJECT PROTECTED ObjectName AS ClassName2 NOINIT WITH cPropertylist. PROTECTED | HIDDEN FUNCTION | PROCEDURE Name_ACCESS | _ASSIGN NODEFAULT cStatements ENDFUNC | ENDPROC. ENDDEFINE,10.3 面向对象的程序设计方法,Visual FoxPro,39,其中,用大写字母组成的单词是保留字,而用小写字母
30、组成的是参数。格式语句中各参数的含义如下: ClassName1:要创建的“类”名称。 ParentClass :要创建的“类”的“父类”,即要创建的类是由哪个“类”派生的,ParentClass既可以是Visuan FoxPro 中的一个“基类”,也可以是开发者自己创建的其他“子类”。 PropertyName1, PropertyName2:列举该类中要保护或隐含的属性名称。 ObjectName:如果创建的是一个容器对象,这个子句指出该容器中所含的其他对象,该参数即是所加入的对象名。 ClassName2:加入的对象ObjectName的“父类”名称。 CPropertylist:创建类
31、的属性名。 Name:创建的类中的过程或函数名 CStatements:类中响应各种事件的方法程序或函数。,Visual FoxPro,40,下面的程序定义了一个表单类test,并在test中加入了一个文本框对象text1,为text1定义了一个响应按键事件的方法程序text1.KeyPress,为表单test定义了一个响应释放事件的程序Destroy。在该程序过程中,没有描述表单test 和其中的文本框text1的属性,也没有说明这两个对象响应其他事件的方法,由于“子类”对其“父类”的继承性,实际上,表单类test具有一般表单的全部属性,其中的文本框对象也具有一般文本框的全部属性,而且,对于
32、没有定义响应程序的事件,它们的反映方法和一般的表单及文本框完全相同。这正是OOP方法带给设计者的好处,只需要描述自己的不同之处,一般的相同之处全部由继承性获得。,Visual FoxPro,41,DEFINE CLASS test AS FORM & 定义Form 类的一个子类TestADD OBJECT text1 AS TEXTBOX & 为Test加入一个文本框对象Text1PROCEDURE text1.KeyPressKG*2PARAMETERS nKeyCode, nShiftAltCtrlKG*2NODEFAULTKG*2IF BETWEEN(nKeyCode, 65, 122)
33、 & 在 A 和 z 之间This.Value = ALLTRIM(This.Value) + *ACTIVATE SCREEN & 将输出发送到 Visual FoxPro 主窗口中? CHR(nKeyCode)KG*2ENDIFENDPROCKG*2PROCEDURE DestroyKG*2CLEAR EVENTSKG*2ENDPROC ENDDEFINE,Visual FoxPro,42,2.用可视法方法设计类 用可视法方法设计类的步骤是: (1)进入 Visual FoxPro所提供的类设计器 有两种方法可以进入类设计器。 第一种方法:直接在菜单栏中进行操作,点击“文件”菜单中的“新建
34、”,指定文件类型为“类”。 第二种方法需要使用 Visual FoxPro提供的另一个工具“项目管理器”,如果已经进入了项目管理器并建立了一个项目文件后,就可在项目管理器中,选择“类”选项卡,并单击“新建”命令按钮。,Visual FoxPro,43,指定子类的有关信息,Visual FoxPro,44,为子类选择“父类”,新设计的类,Visual FoxPro,45,(2)指定子类的名称和存储类的文件名 (3)属性设计 设置属性值 添加新的属性 有时需要添加新的属性,方法是,在Visual Fox Pro 的菜单栏中,选择“类”菜单中“新建属性”选项,在出现的中,指定要添加的属性名称,并单击
35、“添加”按钮,就完成的新属性的添加工作,往后就可以如前面说明的一样设置该属性了。,Visual FoxPro,46,设置类的属性,Visual FoxPro,47,(4)代码设计 代码设计是类设计工作的关键,进入类的代码设计窗口的方法有两种: 双击类的图形 在类上单击鼠标辅按扭,在弹出窗口选择“代码”,Visual FoxPro,48,为类添加新属性,Visual FoxPro,49,10.3.2 对象的设计 对象是类的一个实例,这种实例在不同位置含义不完全相同,所赋予的操作命令也有所不同,例如在一般程序中的对象,实际上是某个类的一个变量,而在容器类中添加的对象则是这个类的一个成员对象,虽然都
36、称为“对象”,但添加这两种不同含义的“对象”的命令有所不同,但其含义又有很多相似之处。,Visual FoxPro,50,下面主要说明在程序中设计和使用对象的方法,至于用可视化的方法设计对象过程,和类的设计过程基本相同,在下一章的表单设计与应用,还会重点介绍,本章对此从略。 1.创建与释放对象 (1) 对象的创建 所谓创建对象,就是在内存中建立一个内存变量。对象只有创建后才能使用,使用命令创建对象的一般格式是: =CreateObject(类名) 功能:在内存中建立一个对象。 参数说明: 对象名:要建立的对象的名字。 类名:要建立的对象的父类。,Visual FoxPro,51,(2)对象变量
37、的分类,和普通变量一样,对象变量也有全局变量、局部变量和私有变量之分,其对应的说明符是:PUBLIC、LOCAL、PRIVATE。局部变量和私有变量都随着创建对象的程序的结束而自动释放,而全局变量则会留存在内存中直到用显式的命令清除对象。私有类型是对象变量的默认类型。 (3)对象变量的释放 从内存中清除指定对象的语句是: Release ,Visual FoxPro,52,2对象的属性设置 对象的属性可以在对象设计阶段设置,也可以在对象运行过程中进行修改。设置对象属性的语句格式是: =,或: WITH 属性名1=属性值1属性名n=属性值n ENDWITH,Visual FoxPro,53,例1
38、0.3 HTST 用面向对象的方法设计一个程序,计算: (1) S=1+2+3+4+100 (2) S=1+1/2+1/3+1/100 这个问题因为非常简单,无需使用这里所讲的OOP方法就可以很快设计出传统的结构化程序,而且,就本例而言,OOP方法比结构化设计方法要麻烦很多。这里只是希望通过一个简单的例子,建立一个用OOP方法设计程序的完整实例。,Visual FoxPro,54,为解决这个问题,本例中设计了一个子类 Myadd_Class,它包含3个属性和两个方法程序,说明如下: 3个属性: S:存放结果和 N:存放求和项数 R1:求和方法标志,当R1=1时,求整数和,为其他值,求分数和 两
39、个方法: S_sum:求和过程 S_show:显示属性S,即显示求和结果。,Visual FoxPro,55,程序如下: Local Myadd Myadd_Object=CreateObject(Myadd_Class) & 根据Myadd_Class派生一个对象 Myadd_Object.r1=1 & 设置Madd_Object对象的属性 Myadd_Object.n=100 Myadd_Object.S_sum & 调用方法S_sum求和 Myadd_Object.S_show KG*2& 调用方法S_show下身结果 Myadd_Object.r1=2 Myadd_Object.S=0
40、 Myadd_Object.S_sum Myadd_Object.S_show RETURN DEFINE CLASS Myadd_class AS CUSTOM WB& 定义一个子类Myadd_Classr1=0DW& Myadd_Class 包含三个属性n=0s=0,Visual FoxPro,56,PROCEDURE S_sum & Myadd_Class的求和方法FOR i=1 to This.nIF This.r1=1 THENThis.s=This.s+iELSEThis.s=This.s+1/iENDIFENDFORENDPROCPROCEDURE S_show & Myadd_
41、Class 的显示结果方法? This.sENDPROC ENDDEFINE,Visual FoxPro,57,3.AddObject()方法 在容器对象中添加对象应使用AddObject()方法,格式是: .AddObject(,.) 功能:在已经建立的容器对象中加入一个由类名派生的对象。,Visual FoxPro,58,例10.4 设计一个表单对象,并在表单上加入一个文本框对象和一个命令按钮对象。 表单是Visual FoxPro中最常用的一种对象,在下一章,会详细说明怎样使用一种可视化的表单设计工具来设计表单,如果使用可视化的方法来完成这个例题会非常简单,但现在还是用纯粹的程序设计来解
42、决这个问题。,Visual FoxPro,59,* 建立一个表单对象,表单中包含一个文本框和一个命令按钮 MyForm=CreateOBject(FORM) & 建立一个表单对象 MyForm.Caption=包含一个文本框和一个命令按钮的示例表单 & 设置表单标签属性 MyForm.AddObject(文本框,TextBox) & 加入一个文本框对象 MyForm.AddObject(命令按钮,CommandButton) &加入一个命令按钮对象 MyForm.文本框.Visible=.T. WB& 设置文本框为可视状态 MyForm.文本框.Top=10DW& 设置文本框距顶边框的距离 MyForm.命令按钮.Visible=.T. MyForm.命令按钮.Top=50 MyForm.Show(1)DW& 使表单可视,Visual FoxPro,60,用程序建立的表单,