OOP技术:易语言面向对象学习_第1页
OOP技术:易语言面向对象学习_第2页
OOP技术:易语言面向对象学习_第3页
OOP技术:易语言面向对象学习_第4页
OOP技术:易语言面向对象学习_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、OOP技术:易语言面向对象学习当前有很多编程语言都是支持面向对象的,如:DELPHI、VC+、JAVA等,但大家对于概念性的一些内容,取很难去理解、学习,有的学习者因为概念入不了门,使得放弃了进一步深入学习。现在,易语言38版也支持类(Class)了,因此,本文通过介绍易语言的面向对象的概念,使大家更加容易地学习了解,再去学习其它语言中的相关知识就不会那么难了。一枯燥的理论1对象和类要讨论“面向对象”,大家必须首先搞懂什么是“对象”。面向对象编程语言中的“对象”概念和我们日常生活中说的“对象”、“东西”或“实体”非常相似(其实编程语言中的“对象”就是从现实生活中的“对象”、“实体”的概念发展而

2、来的)。可以指你面前的这台戴尔电脑或你家楼下的那辆奔驰轿车,也可以指你们公司的销售员小张。编程语言中的“类”的概念也和现实生活中的“类”非常相似。也是对某一类有共同特征的“东西”(实体,也许我们应该称“对象”)的概括。可以看出,“类”是一个抽象的概念,比如当你提到“电脑”这个概念时,你指的不是你面前的这台电脑,不是你家隔壁超市西面出口处用于结帐的那台电脑,也不是世界上任何一台具体的电脑,而是指“电脑”这个抽象的概念,是“具有处理器、存储器和输入、输出设备的电子设备”。同样,“员工”指的也不是你们公司是小张,不是我们公司的小王,也不是世界上任何一家公司的任何一个具体的工作人员,而是“服务于某家公

3、司并定期领取薪水的人”。上面我们所说的“电脑”和“员工”就是两个“类”,因为它们分别概括了某一类型的“对象”的基本特征。另外要说明的一点是:“类”和“所有这类对象的集合”也是不一样的,因为后一个概念虽然也很全面,但它指的仍然是一大堆具体的对象,而不是一个抽象的概念。这也许有点像在玩文字游戏,希望你能适应并喜欢这种游戏规则,毕竟做任何事情都是需要“规则游戏”的,面向对象编程也不例外哦。2类的“成员”与“方法”每个类一般有它的属性,比如每个员工都有自己的“姓名”,每到月底都可以领到 “日工资”乘以“本月出勤天数”算出来的工资。这里的“姓名”、“日工资”和“本月出勤天数”就是“员工”这个类的属性(或

4、叫“成员”)。而每月工资的计算方法(日工资 * 本月出勤天数)就的“员工”类的一个“方法”。在易语言中的类模块中,一个类看起来就像一个程序集,类的成员看起来就像一个程序集变量,类的方法看起来就像程序集中的一个子程序。(注意,只是看起来像,它们之间还是有很明显地区别的)3实例化实例化指的是从一个类到这个类的对象(实例),就像上面说的从“员工”到你们公司的小张。一个类并不是一个可操作的实体,它只是一个概念,只有对象才是可操作的,比如你们公司必须把薪水发放给具体的人(比如小张),而不是发放到抽象的“员工”或“销售员”。在易语言中,生成一个类的实例对象(实例化)就是定义一个以这个类为数据类型的变量。可

5、以在通过点()来使用这个对象的方法,进而操作这个对象(类似于 调用“窗口1.移动()”来移动“窗口1”)。4继承“电脑”、“员工”这两个“类”虽然强大,概括了许许多多的“对象”,但是他们毕竟太宽泛了,有时候我们需要更具体一点的概念。比如别人问你,你家的那台电脑是台什么样的电脑,你就绝对不会回答:“我家的那台电脑是一台电脑”,而是说出你的电脑的品牌,或具体的配置(比如一台“戴尔8530电脑”或“一台奔腾3电脑”)。同样,你会对别人说,你们公司的小张是一个“销售员”。前面提到的“戴尔8530电脑”和“销售员”同样都是类,但是他们分别比“电脑”、“员工”这两个个类更加具体。这里你从“电脑”到“戴尔8

6、530电脑”和从“员工”到“销售员”用的就是“继承”,因为前面的每两对概念中的后一个都具备了前一个的所有特征(比如“销售员”肯定服务于某家公司并定期领取薪水),但是有都比前一个具有更多或更具体的特征(比如销售员有具体的工作:负责销售,“销售员”的薪水可能比普通的员工要高一些)没错,编程语言中的继承就是这样的。总的说来,“继承”指的是从一个相对比较宽泛的类到一个相对具体一点的类。在一个继承关系中相对较宽泛的类被称做后一个类的“基类”,相对较具体的类被称做前一个类的“派生类”。当然,从这个相对较具体的类还可能会得出更加具体一点的类,这又是一个继承关系,这时,这个“相对较具体的类”又成为了“更加具体

7、一点的类”的基类,后一个就是前一个的“派生类”,这样的“具体化”还可能无限继续下去。但是“继承”绝对不能具体化到某个具体的“实体”也就是对象(比如从销售员“具体化”到你们公司的销售员小张),因为继承只能发生在两个“类”之间,一旦从类具体化到了对象那就不叫“继承”了,就成了“实例化”。二牛刀小试1定义一个类,生成实例对象有了理论基础,我们来牛刀小试一把!就以公司的员工为例子吧,打开易语言3.8新建一个窗口程序,插入一个“类模块”,输入如下代码:本程序定义了一个类“员工”,这个类说明了所有公司员工的共同特性都有一个姓名(当然,员工的共同属性肯定不止这些,这里为了简单,仅仅考虑“姓名”)并给它定义了

8、一个文本型成员“姓名”同时提供了两个公开方法用于操作这个成员。其中“取姓名”方法只是简单地返回该类的唯一成员“姓名”;“置姓名”方法用于给“姓名”成员赋值。为了确保“姓名”成员包含合法的姓名信息,程序在“置姓名”方法里加了参数合法性检查。有了一个类,下面我们来进行“实例化”即从“员工”这个抽象的概念具体化到一个公司的员工张三。然后在启动窗口上放置一个按钮,并输入如下代码:这里的程序定义了一个“员工”类型的变量“张三”,也就从“员工”类实例化了一个对象“张三”。由于“张三”是“员工”类的对象,所以他就具有了这个类的所有成员和方法,然后我们就可以调用张三这个对象的两个公开方法对它进行操作了。易语言

9、中所有的类成员均为私有成员,所以我们无法直接通过对象给它的成员赋值,只能通过调用公开方法(张三.置姓名 (“张三”))设置员工的姓名,而我们在“员工”的“置姓名()”方法中加了参数合法性检查,所以实现了对类成员的保护。(其实这个保护是不完整的,如果没有调用张三.置姓名(“张三”),这个员工还是没有姓名的,即用“ 张三.取姓名() ”方法取得的为空文本,下面在讲“_初始化”方法时将解决这个问题。)这里顺便说一下类方法的访问限制。一个类的方法可设置为“公开”或“受保护”,如果一个类的某个方法被“公开”就意味这这个方法可以被该类的其他方法、该类的实例对象和它的派生类访问(即调用);否则,这个方法就是

10、“受保护”方法,受保护方法只能被该类的其他方法和它的派生类访问而不能通过该类的实例对象来访问。比如上面的“张三.置姓名(“张三”)”就是通过对象直接访问类的公有方法。你可以试着把“员工”类的“取姓名()”公开 栏 的勾号去掉把它变成一个受保护方法,再运行该程序,易语言编译器就会报错:“错误(10123): 指定方法“取姓名”未被公开,不能在外部被调用。”看来我们的易语言还是很聪明的哦。关于类方法在继承中的访问限制,我们将在最后面具体讨论。注意:易语言中没有类的公有(公开)成员,它的所有成员均为私有,所以,一个类的所有成员都只能在类的内部使用,而不能通过“对象名.成员名 = 值”的方式来直接访问

11、类的成员。所以,如果你想把一个类的某个成员公开给外部使用,就必须给这个类添加相应的方法来取和置这个成员的值。2“_初始化” 与 “_销毁”在上面的“员工”类的代码中, 还有两个方法我没有提到,那就是这节的标题提到的那两个方法。仔细研究一下,你会发现这两个方法非常特别。第一:方法名都是以下划线开头;第二:它们都是“受保护”的;第三:它们都没有返回值和参数;第四:这两个方法是在我们插入一个类模块时自动生成的。形式的特殊决定了它们功能的特殊。这两个方法是“私有”的,即未公开的,也就是说它们只能在类内部使用。在什么时候使用呢?我们做个实验,在这两个方法中输入如下代码:更改“_按钮1_被单击”子程序如下

12、:然后运行调试运行这个程序,我们发现易语言是这样输出的:在弹出信息框之前:* 员工类 初始化* 张三.置姓名 ()* 张三.取姓名 ()弹出信息框之后:* 子程序即将结束* 员工类 销毁我们可以发现,“_初始化”是在“员工”类生成对象“张三”时被调用,“_销毁”是在该对象超出作用域,将被销毁时调用。由于“张三“对象是一个局部变量,所以它的作用域(生存周期)和它所在的子程序是一样的,于是,在进入这个子程序后,执行第一行代码之前,“张三”就被创建,“_初始化”方法被自动调用;在这个子程序最后一行代码执行完毕即将退出时“张三”就被销毁,“_销毁”方法被自动调用。你也可以用类似的代码验证一下对象作为程

13、序集变量和全局变量使时的情况。另外,每生成该类的一个实例对象,该类的“_初始化”就被调用一次,每销毁一个对象,该类的“_销毁”方法就被调用一次(有点像窗口的“创建完毕”和“销毁”事件)。你可以多招几名员工(生成“员工”类的多个实例,即定义多个“员工”类型的变量)验证一下哦。这两个方法的这种特性在编写程序时可以给我们很大的帮助,让我们有机会在一个对象被创建时做一些初始化工作(比如打开一个文件,初始化类的私有成员),在这个对象被销毁时,做一些善后工作(比如关闭打开的文件)。根据这种特性,我们可以改进以上的代码,实现对“姓名”成员的初始化:更改“员工”类的“_初始化”方法代码如下:这样,就算没有调用

14、 员工变量.置姓名 (“张三”) ,这个员工也会有一个名字(“未命名”)了,因为在这个员工被创建时,“员工”类的“_初始化”方法被自动调用了。人嘛,怎么能没有名字呢。注意:不要更改“_初始化”和“_销毁”方法的方法名、参数、返回值和访问限制(即是否“公开”),否则易语言就会把它们当作普通的成员方法或报编译错误。三一个更丰富的“员工”类为了更好地继续我们的讨论,首先我们应该把上一篇中的“员工”类丰富一下。这次除了可以设置和取出每个员工的姓名外,还要实现一个功能:计算月工资。为了简单其间,我们假定月工资计算公式如下:“月工资 日工资 × 本月出勤天数” 。下面看看这在易语言中如何实现。打

15、开上次的那个例程中的“员工”类模块,添加两个成员:为了能存取这两个私有成员,我们添加如下四个方法:注意:我这里把“置日工资”方法设置为“受保护”(即没有公开),这样当一个员工对象被创建出来后,就无法在外部对该员工的“日工资”进行修改了,比如“张三.置日工资(50)”是编译不成功的。这样才能保证公平性,每个员工的日工资都的一样的,你想多挣钱,就要努力出满勤(或成为一个销售员,下面将继承时,我们会发现,销售员的月工资还包括提成)。更改“_初始化”方法如下:在初始化时(每个员工对象被创建时)调用该类的“受保护”方法“置日工资”设置其日工资为30元。注意,虽然这个方法没有公开,我们还是可以在这里调用,

16、是因为在易语言中,非公开的方法都是“受保护”的,是可以在类内部被其他方法(这里是被“_初始化”)调用的。(参看本篇开头)然后,我们的主角出场了,计算月工资:这个方法很简单,就是根据月工资计算公式计算出员工该月应得的工资并返回。这个类的使用也很简单,比如公司新招聘了两名员工“张三”和“李四”:到该发工资时,然后分别计算二人本月应得的工资:张三和李四中的任何一个都不能用过“置日工资”方法来更改自己的日工资,因为它是一个“受保护”的方法。四再说继承上面我们提到,员工不能通过改变自己的日工资来提高收入,但是可以自己成为一个“销售员”。我们假定销售员的工资计算方式为“工资 日工资 ×出勤天数

17、销售额 × 0.2”。可以看出,销售员也是员工,他除了具有所有员工都具有的姓名,出勤天数,日工资外,还多了一个“销售额”属性,并且工资计算方式也不一样了。如果我们从头写一个“销售员”类的话,我们得把上面“员工”类中除了“计算月工资”以外的代码复制一份到销售员类里,然后加上“销售额”成员,和相应的存取方法,并编写新的“计算月工资”方法。你有没有发现这样做我们的新类中有写东西和以前的“员工”类有重复呢?这种重复除了无谓的浪费外还造成代码的维护困难。面向对象正是要解决这个问题的。看看下面这个“销售员”类是任何写的:现在新插入一个类模块:我们的“销售员”类继承÷自“员工”类,所以它

18、拥有了“员工”类的一切。虽然我们的“销售员”类没有“取姓名”、“置姓名”等方法,但是如果你实例化了一个“销售员”类型的对象(变量)“销售员1”,你同样可以使用“销售员1.置命名()”和“销售员1.取姓名()”。这两个方法从何而来呢?答案只有一个:从“员工”类继承来的。这就是继承的好处,我们不用重复编写“销售员”类的“取姓名”“置姓名”等在“员工”里已经写好的方法了。“销售员”除了继承了它父亲“员工”的“遗产”外,也有自己独有的成员“销售额”和独有的“置销售额()”方法。如果只是继承遗产而没有创新,这继承还有什么意思呢?下面我们集中看销售员的“计算月工资”方法。首先它调用了“取出勤天数 ()”和

19、“取日工资 ()”这是“遗产”然后有和销售额做了运算(这是创新)返回。问题是,它既然继承自员工,并且继承了员工的一切东西,那么它是不是也继承了员工的“计算月工资()”方法呢?答案是“Yes”。第二个问题,那它既然继承了员工的“计算月工资()”,它又有自己的“计算月工资()”,那它是不是有两个“计算月工资()”方法呢?答案是“No!”。销售员既然重写了“计算工资()”方法,那么通过销售员对象调用的“计算工资()”实际上执行的是销售员自己的“计算月工资()”。也就是说:如果派生类重写了基类的某个同名方法,那么在这个派生类中,从基类继承来的那个方法就被“覆盖”掉了。看下面的例子:这次李四如愿以偿,成

20、了销售员,虽然他的出勤天数和张三是一样的,但是他又调用了自己的“计算月工资()”。于是,收入的差距就产生了。五类的多态性类的多态性表示:可以将一个继承类对象赋予到其基类数据类型变量中,此时对此基类对象变量进行操作,将反映出继承类对象的特性。本篇文章中的程序与前两篇有很大的改动,为了解释清楚类的多态性,现在在“员工”基类中增加一个空的“置销售额”的方法,结构要一致。如下所示:再新增加一个新的名为“技术员”的类,其基类为“员工”类。如下所示:然后回到窗口程序集1中,添加一个“员工”类型的程序集变量“职工”,程序内容全部更改为以下所示:大家可以看出,本程序中将继承类对象“技术员”和“销售员”分别赋给

21、基类对象“职工”这样,“职工”就有了继承类对象的特性,在对销售人员的操作时,“职工”的方法操作就等同于对销售员继承类对象的操作。大家也可以看出:基类“员工”有一个“置销售额”方法,而继承类“销售员”里也有一个“置销售额”方法,但当调用基类的“置销售额”方法时,却因为事先已被赋予了继承类的对象,因此实际调用的是继承类的方法。下面如果职工类型太多,也可以用数组循环的方法一次计算出来。下面是使用数组的例程序,可以看到也是将继承类对象分别赋给基类对象,调用时使用数组操作分别调用基类。在此,只是简单地使用数组说明,而没有使用循环。实际上使用数组更能体现“类的多态性”的优越性,因为如果继承类很多的话,只需

22、使用一个循环就可以实现所有操作,非常方便。六虚拟方法实际上通过上述例程就可以了解什么是虚拟方法了。我为大家分析一下程序面板中类的定义,可以看到,基类“员工”中有一个“置销售额”方法,继承类“销售员”中也有一个“置销售额”方法,当子类变量赋值给父类变量后,可以达到覆盖基类方法的目的。当然也可以定义一个抽象虚方法(纯虚函数),即一个空方法,只提供方法的框架而不编写任何代码,实现的过程完全通过子类的覆盖来实现。虚拟方法,又称为虚函数,是一种虚拟出的方法,其他编程语言中通过“virtual”关键字来定义虚函数。虚拟方法就是允许被子类重新定义父类的方法,这就是常说的函数的覆盖(overload)。基本上面向对象是模仿了人类的认知世界,在编写一个大型而实用的程序时,使用对向对象的创作手法要比传统的编程手法有效。如果程序需要改动,也只是需要将某一部分的方法改变,从而无需将程序的所有环节改变。在面向对象的程序设计之前,必须事先作好类的规划,使得程序更加清晰,去除重复性的劳动,代码的维护也不再困难。七总结前述简单讲解了易语言支持类的构造、析构、继承、虚拟方法、多态、封装特性。下面再归纳一下,以加深大家对这些概念的理解。(1)对象的构造:构造顺序为:先构造基类对象,再构造其继承类对象

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论