易语言面向对象学习.docx

上传人:b****5 文档编号:5799198 上传时间:2023-01-01 格式:DOCX 页数:14 大小:158.46KB
下载 相关 举报
易语言面向对象学习.docx_第1页
第1页 / 共14页
易语言面向对象学习.docx_第2页
第2页 / 共14页
易语言面向对象学习.docx_第3页
第3页 / 共14页
易语言面向对象学习.docx_第4页
第4页 / 共14页
易语言面向对象学习.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

易语言面向对象学习.docx

《易语言面向对象学习.docx》由会员分享,可在线阅读,更多相关《易语言面向对象学习.docx(14页珍藏版)》请在冰豆网上搜索。

易语言面向对象学习.docx

易语言面向对象学习

易语言面向对象学习

当前有很多编程语言都是支持面向对象的,如:

DELPHI、VC++、JAVA等,但大家对于概念性的一些内容,取很难去理解、学习,有的学习者因为概念入不了门,使得放弃了进一步深入学习。

现在,易语言3.8版也支持类(Class)了,因此,本文通过介绍易语言的面向对象的概念,使大家更加容易地学习了解,再去学习其它语言中的相关知识就不会那么难了。

一.枯燥的理论

1.对象和类

要讨论“面向对象”,大家必须首先搞懂什么是“对象”。

面向对象编程语言中的“对象”概念和我们日常生活中说的“对象”、“东西”或“实体”非常相似(其实编程语言中的“对象”就是从现实生活中的“对象”、“实体”的概念发展而来的)。

可以指你面前的这台戴尔电脑或你家楼下的那辆奔驰轿车,也可以指你们公司的销售员小张。

编程语言中的“类”的概念也和现实生活中的“类”非常相似。

也是对某一类有共同特征的“东西”(实体,也许我们应该称“对象”)的概括。

可以看出,“类”是一个抽象的概念,比如当你提到“电脑”这个概念时,你指的不是你面前的这台电脑,不是你家隔壁超市西面出口处用于结帐的那台电脑,也不是世界上任何一台具体的电脑,而是指“电脑”这个抽象的概念,是“具有处理器、存储器和输入、输出设备的电子设备”。

同样,“员工”指的也不是你们公司是小张,不是我们公司的小王,也不是世界上任何一家公司的任何一个具体的工作人员,而是“服务于某家公司并定期领取薪水的人”。

上面我们所说的“电脑”和“员工”就是两个“类”,因为它们分别概括了某一类型的“对象”的基本特征。

另外要说明的一点是:

“类”和“所有这类对象的集合”也是不一样的,因为后一个概念虽然也很全面,但它指的仍然是一大堆具体的对象,而不是一个抽象的概念。

这也许有点像在玩文字游戏,希望你能适应并喜欢这种游戏规则,毕竟做任何事情都是需要“规则游戏”的,面向对象编程也不例外哦。

2.类的“成员”与“方法”

每个类一般有它的属性,比如每个员工都有自己的“姓名”,每到月底都可以领到“日工资”乘以“本月出勤天数”算出来的工资。

这里的“姓名”、“日工资”和“本月出勤天数”就是“员工”这个类的属性(或叫“成员”)。

而每月工资的计算方法(日工资*本月出勤天数)就的“员工”类的一个“方法”。

在易语言中的类模块中,一个类看起来就像一个程序集,类的成员看起来就像一个程序集变量,类的方法看起来就像程序集中的一个子程序。

(注意,只是看起来像,它们之间还是有很明显地区别的)

3.实例化

实例化指的是从一个类到这个类的对象(实例),就像上面说的从“员工”到你们公司的小张。

一个类并不是一个可操作的实体,它只是一个概念,只有对象才是可操作的,比如你们公司必须把薪水发放给具体的人(比如小张),而不是发放到抽象的“员工”或“销售员”。

在易语言中,生成一个类的实例对象(实例化)就是定义一个以这个类为数据类型的变量。

可以在通过点(.)来使用这个对象的方法,进而操作这个对象(类似于调用“窗口1.移动(……)”来移动“窗口1”)。

4.继承

“电脑”、“员工”这两个“类”虽然强大,概括了许许多多的“对象”,但是他们毕竟太宽泛了,有时候我们需要更具体一点的概念。

比如别人问你,你家的那台电脑是台什么样的电脑,你就绝对不会回答:

“我家的那台电脑是一台‘电脑’”,而是说出你的电脑的品牌,或具体的配置(比如一台“戴尔8530电脑”或“一台奔腾3电脑”)。

同样,你会对别人说,你们公司的小张是一个“销售员”。

前面提到的“戴尔8530电脑”和“销售员”同样都是类,但是他们分别比“电脑”、“员工”这两个个类更加具体。

这里你从“电脑”到“戴尔8530电脑”和从“员工”到“销售员”用的就是“继承”,因为前面的每两对概念中的后一个都具备了前一个的所有特征(比如“销售员”肯定服务于某家公司并定期领取薪水),但是有都比前一个具有更多或更具体的特征(比如销售员有具体的工作:

负责销售,“销售员”的薪水可能比普通的员工要高一些)没错,编程语言中的继承就是这样的。

总的说来,“继承”指的是从一个相对比较宽泛的类到一个相对具体一点的类。

在一个继承关系中相对较宽泛的类被称做后一个类的“基类”,相对较具体的类被称做前一个类的“派生类”。

当然,从这个相对较具体的类还可能会得出更加具体一点的类,这又是一个继承关系,这时,这个“相对较具体的类”又成为了“更加具体一点的类”的基类,后一个就是前一个的“派生类”,这样的“具体化”还可能无限继续下去。

但是“继承”绝对不能具体化到某个具体的“实体”也就是对象(比如从销售员“具体化”到你们公司的销售员小张),因为继承只能发生在两个“类”之间,一旦从类具体化到了对象那就不叫“继承”了,就成了“实例化”。

二.牛刀小试

1.定义一个类,生成实例对象

有了理论基础,我们来牛刀小试一把!

就以公司的员工为例子吧,打开易语言3.8新建一个窗口程序,插入一个“类模块”,输入如下代码:

本程序定义了一个类“员工”,这个类说明了所有公司员工的共同特性——都有一个姓名(当然,员工的共同属性肯定不止这些,这里为了简单,仅仅考虑“姓名”)并给它定义了一个文本型成员“姓名”同时提供了两个公开方法用于操作这个成员。

其中“取姓名”方法只是简单地返回该类的唯一成员“姓名”;“置姓名”方法用于给“姓名”成员赋值。

为了确保“姓名”成员包含合法的姓名信息,程序在“置姓名”方法里加了参数合法性检查。

有了一个类,下面我们来进行“实例化”即从“员工”这个抽象的概念具体化到一个公司的员工——张三。

然后在启动窗口上放置一个按钮,并输入如下代码:

这里的程序定义了一个“员工”类型的变量“张三”,也就从“员工”类实例化了一个对象“张三”。

由于“张三”是“员工”类的对象,所以他就具有了这个类的所有成员和方法,然后我们就可以调用张三这个对象的两个公开方法对它进行操作了。

易语言中所有的类成员均为私有成员,所以我们无法直接通过对象给它的成员赋值,只能通过调用公开方法(张三.置姓名(“张三”))设置员工的姓名,而我们在“员工”的“置姓名()”方法中加了参数合法性检查,所以实现了对类成员的保护。

(其实这个保护是不完整的,如果没有调用 张三..置姓名(“张三”),这个员工还是没有姓名的,即用“张三.取姓名()”方法取得的为空文本,下面在讲“_初始化”方法时将解决这个问题。

这里顺便说一下类方法的访问限制。

一个类的方法可设置为“公开”或“受保护”,如果一个类的某个方法被“公开”就意味这这个方法可以被该类的其他方法、该类的实例对象和它的派生类访问(即调用);否则,这个方法就是“受保护”方法,受保护方法只能被该类的其他方法和它的派生类访问而不能通过该类的实例对象来访问。

比如上面的“张三.置姓名(“张三”)”就是通过对象直接访问类的公有方法。

你可以试着把“员工”类的“取姓名()”公开栏的勾号去掉把它变成一个受保护方法,再运行该程序,易语言编译器就会报错:

“错误(10123):

指定方法“取姓名”未被公开,不能在外部被调用。

”看来我们的易语言还是很聪明的哦。

关于类方法在继承中的访问限制,我们将在最后面具体讨论。

注意:

易语言中没有类的公有(公开)成员,它的所有成员均为私有,所以,一个类的所有成员都只能在类的内部使用,而不能通过“对象名.成员名=值”的方式来直接访问类的成员。

所以,如果你想把一个类的某个成员公开给外部使用,就必须给这个类添加相应的方法来取和置这个成员的值。

2.“_初始化”与“_销毁”

在上面的“员工”类的代码中,还有两个方法我没有提到,那就是这节的标题提到的那两个方法。

仔细研究一下,你会发现这两个方法非常特别。

第一:

方法名都是以下划线开头;第二:

它们都是“受保护”的;第三:

它们都没有返回值和参数;第四:

这两个方法是在我们插入一个类模块时自动生成的。

形式的特殊决定了它们功能的特殊。

这两个方法是“私有”的,即未公开的,也就是说它们只能在类内部使用。

在什么时候使用呢?

我们做个实验,在这两个方法中输入如下代码:

更改“_按钮1_被单击”子程序如下:

然后运行调试运行这个程序,我们发现易语言是这样输出的:

在弹出信息框之前:

*员工类初始化

*张三.置姓名()

*张三.取姓名()

弹出信息框之后:

*子程序即将结束

*员工类销毁

我们可以发现,“_初始化”是在“员工”类生成对象“张三”时被调用,“_销毁”是在该对象超出作用域,将被销毁时调用。

由于“张三“对象是一个局部变量,所以它的作用域(生存周期)和它所在的子程序是一样的,于是,在进入这个子程序后,执行第一行代码之前,“张三”就被创建,“_初始化”方法被自动调用;在这个子程序最后一行代码执行完毕即将退出时“张三”就被销毁,“_销毁”方法被自动调用。

你也可以用类似的代码验证一下对象作为程序集变量和全局变量使时的情况。

另外,每生成该类的一个实例对象,该类的“_初始化”就被调用一次,每销毁一个对象,该类的“_销毁”方法就被调用一次(有点像窗口的“创建完毕”和“销毁”事件)。

你可以多招几名员工(生成“员工”类的多个实例,即定义多个“员工”类型的变量)验证一下哦。

这两个方法的这种特性在编写程序时可以给我们很大的帮助,让我们有机会在一个对象被创建时做一些初始化工作(比如打开一个文件,初始化类的私有成员),在这个对象被销毁时,做一些善后工作(比如关闭打开的文件)。

根据这种特性,我们可以改进以上的代码,实现对“姓名”成员的初始化:

更改“员工”类的“_初始化”方法代码如下:

这样,就算没有调用员工变量.置姓名(“张三”),这个员工也会有一个名字(“未命名”)了,因为在这个员工被创建时,“员工”类的“_初始化”方法被自动调用了。

人嘛,怎么能没有名字呢。

注意:

不要更改“_初始化”和“_销毁”方法的方法名、参数、返回值和访问限制(即是否“公开”),否则易语言就会把它们当作普通的成员方法或报编译错误。

三.一个更丰富的“员工”类

为了更好地继续我们的讨论,首先我们应该把上一篇中的“员工”类丰富一下。

这次除了可以设置和取出每个员工的姓名外,还要实现一个功能:

计算月工资。

为了简单其间,我们假定月工资计算公式如下:

“月工资=日工资×本月出勤天数”。

下面看看这在易语言中如何实现。

打开上次的那个例程中的“员工”类模块,添加两个成员:

为了能存取这两个私有成员,我们添加如下四个方法:

注意:

我这里把“置日工资”方法设置为“受保护”(即没有公开),这样当一个员工对象被创建出来后,就无法在外部对该员工的“日工资”进行修改了,比如“张三.置日工资(50)”是编译不成功的。

这样才能保证公平性,每个员工的日工资都的一样的,你想多挣钱,就要努力出满勤(或成为一个销售员,下面将继承时,我们会发现,销售员的月工资还包括提成)。

更改“_初始化”方法如下:

在初始化时(每个员工对象被创建时)调用该类的“受保护”方法“置日工资”设置其日工资为30元。

注意,虽然这个方法没有公开,我们还是可以在这里调用,是因为在易语言中,非公开的方法都是“受保护”的,是可以在类内部被其他方法(这里是被“_初始化”)调用的。

(参看本篇开头)

然后,我们的主角出场了,计算月工资:

这个方法很简单,就是根据月工资计算公式计算出员工该月应得的工资并返回。

这个类的使用也很简单,比如公司新招聘了两名员工“张三”和“李四”:

到该发工资时,

然后分别计算二人本月应得的工资:

张三和李四中的任何一个都不能用过“置日工资”方法来更改自己的日工资,因为它是一个“受保护”的方法。

四.再说继承

上面我们提到,员工不能通过改变自己的日工资来提高收入,但是可以自己成为一个“销售员”。

我们假定销售员的工资计算方式为“工资=日工资×出勤天数+销售额×0.2”。

可以看出,销售员也是员工,他除了具有所有员工都具有的姓名,出勤天数,日工资外,还多了一个“销售额”属性,并且工资计算方式也不一样了。

如果我们从头写一个“销售员”类的话,我们得把上面“员工”类中除了“计算月工资”以外的代码复制一份到销售员类里,然后加上“销售额”成员,和相应的存取方法,并编写新的“计算月工资”方法。

你有没有发现这样做我们的新类中有写东西和以前的“员工”类有重复呢?

这种重复除了无谓的浪费外还造成代码的维护困难。

面向对象正是要解决这个问题的。

看看下面这个“销售员”类是任何写的:

现在新插入一个类模块:

我们的“销售员”类继承÷自“员工”类,所以它拥有了“员工”类的一切。

虽然我们的“销售员”类没有“取姓名”、“置姓名”等方法,但是如果你实例化了一个“销售员”类型的对象(变量)“销售员1”,你同样可以使用“销售员1.置命名(……)”和“销售员1.取姓名()”。

这两个方法从何而来呢?

答案只有一个:

从“员工”类继承来的。

这就是继承的好处,我们不用重复编写“销售员”类的“取姓名”“置姓名”等在“员工”里已经写好的方法了。

“销售员”除了继承了它父亲“员工”的“遗产”外,也有自己独有的成员“销售额”和独有的“置销售额()”方法。

如果只是继承遗产而没有创新,这继承还有什么意思呢?

下面我们集中看销售员的“计算月工资”方法。

首先它调用了“取出勤天数()”和“取日工资()”这是“遗产”然后有和销售额做了运算(这是创新)返回。

问题是,它既然继承自员工,并且继承了员工的一切东西,那么它是不是也继承了员工的“计算月工资()”方法呢?

答案是“Yes”。

第二个问题,那它既然继承了员工的“计算月工资()”,它又有自己的“计算月工资()”,那它是不是有两个“计算月工资()”方法呢?

答案是“No!

”。

销售员既然重写了“计算工资()”方法,那么通过销售员对象调用的“计算工资()”实际上执行的是销售员自己的“计算月工资()”。

也就是说:

如果派生类重写了基类的某个同名方法,那么在这个派生类中,从基类继承来的那个方法就被“覆盖”掉了。

看下面的例子:

这次李四如愿以偿,成了销售员,虽然他的出勤天数和张三是一样的,但是他又调用了自己的“计算月工资()”。

于是,收入的差距就产生了。

五.类的多态性

类的多态性表示:

可以将一个继承类对象赋予到其基类数据类型变量中,此时对此基类对象变量进行操作,将反映出继承类对象的特性。

本篇文章中的程序与前两篇有很大的改动,为了解释清楚类的多态性,现在在“员工”基类中增加一个空的“置销售额”的方法,结构要一致。

如下所示:

再新增加一个新的名为“技术员”的类,其基类为“员工”类。

如下所示:

然后回到窗口程序集1中,添加一个“员工”类型的程序集变量“职工”,程序内容全部更改为以下所示:

大家可以看出,本程序中将继承类对象“技术员”和“销售员”分别赋给基类对象“职工”这样,“职工”就有了继承类对象的特性,在对销售人员的操作时,“职工”的方法操作就等同于对销售员继承类对象的操作。

大家也可以看出:

基类“员工”有一个“置销售额”方法,而继承类“销售员”里也有一个“置销售额”方法,但当调用基类的“置销售额”方法时,却因为事先已被赋予了继承类的对象,因此实际调用的是继承类的方法。

下面如果职工类型太多,也可以用数组循环的方法一次计算出来。

下面是使用数组的例程序,可以看到也是将继承类对象分别赋给基类对象,调用时使用数组操作分别调用基类。

在此,只是简单地使用数组说明,而没有使用循环。

实际上使用数组更能体现“类的多态性”的优越性,因为如果继承类很多的话,只需使用一个循环就可以实现所有操作,非常方便。

六.虚拟方法

实际上通过上述例程就可以了解什么是虚拟方法了。

我为大家分析一下程序面板中类的定义,可以看到,基类“员工”中有一个“置销售额”方法,继承类“销售员”中也有一个“置销售额”方法,当子类变量赋值给父类变量后,可以达到覆盖基类方法的目的。

当然也可以定义一个抽象虚方法(纯虚函数),即一个空方法,只提供方法的框架而不编写任何代码,实现的过程完全通过子类的覆盖来实现。

虚拟方法,又称为虚函数,是一种虚拟出的方法,其他编程语言中通过“virtual”关键字来定义虚函数。

虚拟方法就是允许被子类重新定义父类的方法,这就是常说的函数的覆盖(overload)。

基本上面向对象是模仿了人类的认知世界,在编写一个大型而实用的程序时,使用对向对象的创作手法要比传统的编程手法有效。

如果程序需要改动,也只是需要将某一部分的方法改变,从而无需将程序的所有环节改变。

在面向对象的程序设计之前,必须事先作好类的规划,使得程序更加清晰,去除重复性的劳动,代码的维护也不再困难。

七.总结

前述简单讲解了易语言支持类的构造、析构、继承、虚拟方法、多态、封装特性。

下面再归纳一下,以加深大家对这些概念的理解。

(1)对象的构造:

构造顺序为:

先构造基类对象,再构造其继承类对象,如果类中具有对象成员,则先于其所处对象构造。

表示必须先创建基类对象,才能在此基础上创建继承类对象,如果类中有对象成员,则会先于其所处对象建立。

例如本程序中的“员工”是基类,而“销售员”是继承类,先有基类,再建立继承类。

(2)对象的析构:

析构顺序为:

先析构继承类对象,再析构基类对象,如果类中具有对象成员,则在其所处对象后析构。

表示在类销毁时,先将最下级的继承类销毁,如果类中有对象成员,则会后于其所处对象销毁。

(3)类的封装:

A、类的所有成员数据变量只能由该类本身的方法代码所访问,属于私有性质。

相当于子程序中的子程序变量只能由本子程序访问,其它子程序不能访问。

B、在继承类中可以以“类名.方法名”的方式指定访问基础类中的方法。

相当于子程序可以调用另一个窗口集中的子程序,但必须具体指定。

C、只有标记为“公开”的方法才能在类代码外部通过该类的对象实体来访问。

类的方法可设置公开属性,如果某方法设置公开,就可以被其它类继承或访问。

(4)继承:

任何类均可以指定另外一类作为其基类,继承层数不限。

继承后的类将会拥有上级的公开方法。

(5)多态性:

可以将一个继承类对象赋予到其基类数据类型变量中,此时对此基类对象变量进行操作,将反映出继承类对象的特性。

例程中以数组的方式将继承类对象赋给基类数据类型变量中,以后调用基类数组中的这些数组成员就可以实现不同的继承类方法。

(6)虚拟方法:

在基类中的方法可以被其继承类中的同名方法覆盖,当调用此方法时,系统自动根据所调用的对象实体去调用对应的方法。

如果基类中的方法与继承类中的方法有重名,则会各自调用类中重名方法的功能。

好了,学习易语言的面向对象方法编程到此结束了,更多的需要大家自己亲手实践,实际上使用中文编程语言易语言学习面向对象是比英文编程软件简单得多,更加容易理解,大家觉得呢。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1