易语言教程.pdf
1《易 飞扬 面向对 象编 程》每年公司周年庆我都会有个小小的礼物给大家的 , 今年也不例外 , 教材是最好的礼物 了,本文简单介 绍了 “ 易语言 . 飞扬 ” 系统的面 向对象编程方法 ,易飞扬还在紧张地开发之中,愿大家与易飞扬一起成长 。“ 易语言 . 飞扬 ” 官方网站: htt p:/ / w w w .dyw t .c om . c n“ 易语言 . 飞扬 ” 官方论坛 : htt p:/ / w w w .dyw t .c om . c n/vbs/ i nd e x.as p?boar did=148《 “ 易 . 自 . 然 ” 编程思想》地址:htt p:/ / w w w .dyw t .c om . c n/vbs/ dis pbbs.a s p?boar dID = 148学生 对象 张三 = 创建 学生 对象 (“张三 “);销毁销毁销毁销毁用户不需要关心对象何时被销毁以及如何销毁。这完全是 “ 垃圾收集器 ” 的工作。在对象被销毁之前 , 其 “ 清理 ( ) ” 方法会被系统调用 。 用户可在此方法中做一些处理,但这种需求并不多见。重载重载重载重载那么对于一个类中的方法命令,如果重名了,就是 “ 重载 ” 。这个问题的由来类似于中国人口那么多 , 那么叫 “ 王强 ” 、 “ 赵军 ” 的不计其数 , 这个就是重名了 , 但人还是不一样的 , 因为那么多人不可能是一个人吧 。 现在好了 , 在编程中 ,于一类的事物可以只取一个名字 , 而参数不同就可以进行处理了 , 这样不仅可以节约名称(有意义名字总有用完的一天 ) ,还可以让系统去自动根据参数的不同来进行处理。很强的功能哦。在一个类中,如果多个方法(不包括基类中的方法)具有 “ 相同的方法名称和不同的参数形式 ” ,那么称这个方法名称被 “ 重载 ” 。“ 不同的参数形式 ” 意味着:参数个数不同,或参数个数相同但 “ 相同位置处有不同类型的参数 ” 。编译器将根据实际传入的参数形式选择调用匹配的重载方法。下面还是举个例子来说明的好。例如我们有两个名为 “ 移动 ” 的方法命令 , 参数不一样 , 一个方法只有一个参数是文本型,表示地点,另一个方法有两个参数是 X Y 坐标。公开 类 启动类{公开 静态 启动 ( ){15好朋友 . 移动 ( “ 大连 “ ) ;好朋友 . 移动 ( 123,456);}}公开 类 好朋友{公开 静态 移动 ( 文本 地点 ){控制台 . 输出行 ( “ 移动到 “ + 地点 ) ;}公开 静态 移动 ( 小数 坐标 X , 小数 坐标 Y ){控制台 . 输出行 ( “ 移动到 “ + 坐标 X . 到文本 ( ) + “ , “ + 坐标 Y . 到文本 ( ) ) ;}}运行结果如下:怎么样 , 厉害吧 , 易飞扬编译器生成的代码会自动处理一些事情的 , 有点智能化哦。实际上将 “ 重载 ” 理解为 “ 重名 ” 就好了。封装封装封装封装讲继承之前要讲到封装的。封装听起来很可怕 , 其实它什么也不是 。 就是将类装在一个盒子里 , 不可见 ,外国人以前称之为黑盒子,现在叫封装,换汤不换药而已。还记得前面说过的类中有不公开的私有成员吗?这个就是其他人不可见了 ,就称之为封装了。白皮书中是这样说的 : 类可以使用私有成员存储内部数据 , 可以使用私有方法对内部数据进行处理 , 可以通过公开或扩展的属性 、 方法 、 事件对外界提供操作接口,这些都是类的封装机制的体现。也就是你的好朋友自己有五脏六腹,不用你给他就有,他也不会给你看 , 因为这是他的隐私。但是他有衣服、名字等这些外在的东西你能看到,他会说话 ,这是他的公开的接口 , 虽然我们并不了解他的真实想法 , 这也是一种保护的方法 。16具体的例程看前面的没有公开属性的类方法命令就行了。继承继承继承继承父母的财产可以由孩子来继承 , 父母的基因可以传承给子女 , 传承后可能有些基本的没有改变 , 有些就有些改变了 。 下面是两个公开类 , 类名不一样 , 但是小汽车是个子类,他的父类就是汽车。汽车可以包含的子类很多,如公交车 , 卡车等。下面给出代码:公开 类 汽车{公开 移动 ( 文本 地点 ){控制台 . 输出行 ( “ 移动到 “ + 地点 ) ;}公开 移动 ( 小数 坐标 X , 小数 坐标 Y ){控制台 . 输出行 ( “ 移动到 “ + 坐标 X . 到文本 ( ) + “ , “ + 坐标 Y . 到文本 ( ) ) ;}}公开 类 小汽车 {公开 移动 ( 文本 地点 ){控制台 . 输出行 ( “ 安装火箭移动到 “ + 地点 ) ;}公开 移动 ( 小数 坐标 X , 小数 坐标 Y ){控制 台 . 输出 行 ( “ 安装 火箭移动 到 “ + 坐标 X . 到文 本 ( ) + “ ,“ + 坐标 Y . 到文本 ( ) ) ;}}调用的代码为以下:公开 类 启动类{公开 静态 启动 ( ){汽车 奇瑞 = 创建 汽车 ;/ / 汽车 奇瑞 = 创建 小汽车 ;奇瑞 . 移动 ( “ 大连 “ ) ;奇瑞 . 移动 ( 123,456);17}}大家可以看到,上述代码中如果将第一行的创建代码屏蔽 , 与将第二行的创建代码屏幕后的执行效果是不一样的。因为小汽车继承了父类汽车的两个方法,因此根据创建时的不同 , 运行效果也就不一样了。这个哪里运用最多呢?这样有什么好处呢?1 .原来,可以将一些类封装为类库,然后公开接口,如果你对某个类不满意,你就可以继承他的类,原始的类库不用更改。2 .也方便大型软件的共同开发,架构师将父类全部定义好,即使是空的没有代码的也无所谓了,然后由下面的工程师制作子类继承,将真实的代码写入 。3 . 改进软件也成为一件非常方便的事 , 如果某个类中的功能不适合使用了 ,需要升级了,就可以再一次地继承他,方便了程序的升级。多态多态多态多态多态实际上是与对象紧密相联系的 。 在类中 , 可以创建一个方法 , 如果这个方法中采用了对象作为参数 , 那么如果对象传递时是基类 , 那么就按基类进行处理,如果对象传递时是子类,那么就按子类进行处理。大家看下面的代码:公开 类 基类{公开 输出 (){控制台 . 输出行 (“基类 “);}}公开 类 子类 {公开 输出 (){控制台 . 输出行 (“子类 “);}}上述代码中有两个类 , 一个是基类 , 一个是子类 。 那么都有相同的输出方法 ,且子类的输出方法覆盖了父类的输出方法。当创建不同的对象时 , 那么如果传递了这些不同的对象 , 就会按不同对象进行处理,代码如下:公开 类 启动类{公开 静态 启动 ()18{基类 基类 1 = 创建 基类 ();子类 子类 1 = 创建 子类 ();测试多态 ( 基类 1);测试多态 ( 子类 1);}静态 测试多态 ( 基类 参数 ){参数 . 输出 ();}}上述代码中 , 可以看到 , 加了一个 “ 创建多态 ” 的方法命令 , 而这个方法命令的参数是对象 , 因此当上述 “ 启动 ” 方法命令中创建了两个不同的对象 , 一个是父对象 , 一个是子对象 , 于是在调用 “ 测试多态 ” 的静态方法时 , 就根据不同的对象进行了不同的处理。接口接口接口接口“ 接口 ” 很简单,就是这样一种东西:就是空的方法组成的一个类,打包成类模块,然后供大家一起调用。这个类里的方法中 , 没有具体的代码 , 就是一个空的表 , 也可称之为接口表 。类似于 C 语言中 的头文件。 接口具体的 好处是在于 多人工程开 发时,由系 统分析师制定出统一标准的接口 , 程序师进行具体接口程序的编程 , 这样大家在进行大型工程项目时就通过接口进行沟通了。使用 “ 接口 ” 时要注意以下几点:1 . 接口只 “ 声明 ” 一个或多个 “ 公开 ” 的方法 , 但不提供方法的实现代码 。也就是不需要系统分析师写代码。2 .定义接口方法时可以省略掉方法的 “ 公开 ” 属性,编译器默认其具有此属性。也就是说系统分析师可以偷一些懒了。写接口的格式样例如下:公开 接口 接口 1{公开 接口方法 1() ;公开 接口方法 2() ;}接口声明与类声明是同级别的。3 .只有类可以实现接口。一个类可以实现多个接口。一个接口可以实现多个方法。4 .接口文件编译为类库后,由系统分析师提交给程序师具体实现,不必提供类库的源文件 。 也就是说上述接口定义的代码保存 为 E F 文件 , 然后编译 为 E C L19文件,只要提供程序员 E C L 文件给他们编程就可以了。5 . 接口类似一种 “ 规范 ” , 如果某个类实现了此接口 , 表明此类遵循了此规范,以后就可以按照这种规范的要求来使用此类。6 .当系统分析师提供类以后,由程序师来实现接口的具体代码时,要将此接口中的所有方法实现,一个也不能少哦,编译器会做严格的检查。一个类欲实现某个接口 , 意味着这个类 “ 必须实现这个接口 ( 及其所有基接口)中声明的所有方法 ” 。7 .实现接口,就是由程序师具体实现原来接口表中空方法的代码。那么在定义类时,程序师需要将接口的信息告诉类。定义类时 , 通过 “ 接口实现表 ” 属性来指定该类所实现的接口 , 示例代码如下:类 类 1 / / 指定单个已实现的接口{公开 接口方法 1(){/ / 这里需要程序员添加 具体 实现 代码}公开 接口方法 2(){/ / 这里需要程序员添加 具体 实现 代码}}类 类 2 / / 指定多个已实现的接口{/ / }上述代码中 , 类 1 指定了一个接口 , 类 2 指定了多个接口 , 具体的代码在接口方法中实现。上述 的代码保 存为 E F 文件 后可以进 行编译, 在编译为 E X E 文件 时,会检查 E C L 类库中的接口情 况,如果正常,那么对于接口的调 用就相当于对于类中具体实现代码的调用。接口通过 “ 定义接口 ” 、 “ 实现接口 ” 的两个步骤后 , 下面就可以进行 “ 使用接口 ” 了 。 定义接口是由系统分析师进行的工作 , 实现接口是由程序师进行的工作 , 一般大的项目就会这样安排 , 以利于分工合作 , 但是如果小的项目一般用不上,即使用上了,上述的也可能是一个人进行的。例如,在系统核 心库中已有一个现成的接口,并且 被编译为 E C L 类库,接口原代码可能为以下形式 : (定义接口)公开 接口 错误处理{公开 逻辑 处理错误 ( 整数 错误码 , 文本 错误文本 ) ;20}实现接口的代码可以写成以下内容:公开 类 错误处理类 {公开 逻辑 处理错误 ( 整数 错误码 , 文本 错误文本 ){控制台 . 输出行 ( “ 哈哈,系统运行时错误被我捕获 ! ! ! “ ) ;控制台 . 输出 ( “ 错码码 “ ) ;控制台 . 输出行 ( 错误码 ) ;控制台 . 输出行 ( 错误文本 ) ;返回 真 ;}}调用接口的代码可以为以下形式:公开 类 启动类{公开 静态 启动 ( ){控制台 . 输出行 ( “ 测试中 “ ) ;错误处理 自定接口 = 创建 错误处理类 ;运行环境 . 置错误管理器 ( 自定接口 ) ;对象 对象 1; / / = 创建 对象 ( ) ;控制台 . 输出行 ( 对象 1.到文本 ( ) ) ; / / 故意使用 “ 空 “ 对象}}当调用接口的方法时,就相当于调用了具体对象实现的方法。其中有两行大家要注意:错误处理 自定接口 = 创建 错误处理类 ;运行环境 . 置错误管理器 ( 自定接口 ) ;上述代码中可以看到 , “ 错误处理类 ” 对象被声明到 “ 错误处理 ” 这个接口中,然后下面一行对接口的操作实际上就是对对象的操作。总结总结总结总结大家也可以先学习旧版易语言中的面向对象 , 等熟悉之后 , 再学习易飞扬就非常轻松了。对比如下:面向对象因素 V B 易语言 易飞扬构造 / 初始 有 有 有析构 / 清理 有 有 有21继承 不支持 有 有虚拟方法 不支持 有 有多态 不支持 有 有封装 有 有 有重载 / 重名 无 无 有接口 无 无 有易语言中的面向对象教材可以通过学习 《 易语言编程系统 》 第十八章 , 或 “ 易语言知识库 E S D N → 资料手册 → 开发手册 → 易语言面对对象编程 ” 中可以找到 。看教材的目的就是要实用 , 那么上述用了好朋友进行比喻 , 如果应用到实际程序中将会如何呢?你要将你的数据库系统用分类的方法进行分门别类 , 如菜单类,快捷键类,数据库操作类 …… 这样,一个具有人性化的程序就会出来了 , 里面的命令程序只要按面向对象的方法调用就行了。好了 , 大话面向对象到此暂告一段落 , 希望通过这些小小的比喻大家能了解掌握面向对象的知识 , 逐步看一些大一些的面向对象的例程 , 看的时候大家可以将这些大例程中的对象用概念图画出他的层次结构 , 互相之间的继承关系 , 以这样的方式对对象进行研究,这样基本上就能看明白了。最后要告诉大家的是 , 我还会写更多的教材和练习给大家看 , 毕竟在大量的练习下才会有长足的进步。面向对象并不难,细细品味易飞扬,道法自然是根本,编程世界谁称王!本章 主要 介绍易 语言 子程序 的创建和 调用、 子程序 参数的 使用以 及参数属性的设置方法。第 8 章 易语 言的子 程序22将程序分割成较小的 功能 单元就可以简化程序设计任务 , 这些功能单元 被称为子程序 , 可以把共享的或常调用的功能置于子程序中 , 达到简化程序设计 、 方便代码重用和提高程序维护效率的目的 ,这是结构化程序设计的主要特征之一。• 子程序可 把 程序划分成 相对独立 的 功能 单元 , 每个单元都比无子程序的整个程序容易调试 和 理解;• 一个应用程序中的子程序 , 往往不必修改或只需稍作改动 , 便可以成为另一个程序的子程序。8.1 新建子程序本章 学习内容 :8 . 1 新建子程序 8. 6 参数的参考属性8. 2 调用子程序 8. 7 子程序的返回值8. 3 两类子程序的区别 8. 8 课后练习8. 4 子程序参数8. 5 参数的可空属性下面 我们 就开始 新建 第一个 自定义子 程序。 方法十 分简单 ,一步 一步跟我来吧!② 将光标移到代码编辑行 ,右 键 单 击 , 在 弹 出 菜 单 中 选 择“ 新子程序 ” 命令 , 就可以新建子程序。① 首 先 在启 动 窗 口 添加 一 个 按钮 , 默 认 名称 为 “ 按 钮1 ” 。 双 击 按钮 1 进 入 代码 编 辑 界面。另一种更快捷的方法是 , 在代 码 编 辑 区 获得焦点时 , 同时按下 “ Ctrl 键 ”和 “ N 键 ” , 也可 以 新 建 子 程序。新 建 子 程序 的 默 认 名 称为 “ 子程序 1 ” ,依此类推。238.2 调用子程序第三种方法 , 到主菜单上。 选择 “ 插入 ”“ 新子程序 ” 命令也可新建子程序。注意:在 同 一个程序集中 ,子 程 序 名 不能重复 。 特别在 修 改 的 时候 , 易语言会提 示 并 修 改已 经 被 使 用过的名称。“ 子 程 序1 ” 已经存在 ,当 另 一 个 子 程序 被 修 改 成“ 子 程 序 1 ”时 , 易语言弹出出错提示。被易语言修改的子程序名。新建的子程序没有 参数,这需要操作者自行添加所需 数目的参数并设置参数的类型以及参数的可空、参考和数组等属性。特别应该注意的是 ,每个新建的子程序都不会被易语 言或其它子程序自动调用,下面将讲解如何调用子程序。前一 节中 讲了如 何建 立子程 序,下面演示如何调用一个子程序。24② 在 “ 子程序 1 ” 中添加代码 : 信息框( “ 你好 ! 我是信息框 。 ” , #信息图标 , )① 在 “ _ 按 钮1_被单击 ” 事件子 程 序 中 添 加程序 代码 “ 子程序 1 ( ) ” 或直接复制名称 ,将其粘贴过来 。③ 在 “ 按钮 2 ” 事件子程 序 中 添 加代码 ‘ 子程序 1 () ’ 。同 一 个子 程 序 可 以被多次调用 。一个子程序可以在事件子程序和其它新建的子程序中多次被调用 , 也可以被其它程序集的事件子程序和新建的子程序调用 。 要注意的是 , 在本程序中定义的子程序只能在本程序中使用。每次 调用子 程序时 ,子程 序中的 所有 命令 都将 从第一 条开始 顺序执行 , 当执行到子程序尾部或者遇到 “ 返回 ” 命令时即返回到调用此子程序命令 的下一条 命令 处。④ 按 F 5 键运行 程序,分别 单击 “ 按钮 1 ” 和 “ 按钮 2 ” ,都能弹出 “ 子程序 1 ” 里的信息框。① 把 “ 子程序 1 ” 修改为 “ 信 息 框子程序 ” 。这 里 的“ 子程序 1 ” 同时被修改为 ‘ 信息框子程序 ’ 。258.3 两类子程序的区别上节中提到了子程序名称的问题,这里我们还要提一个小建议。当要修改一个子程序名称时,应该直接到这个子程序的定义位置进行修改。这样可以使调用它的程序代码同步修改该子程序的名称,如上图所示。这可以避免因调用无效子程序导致的编译错误。大家可以看到, 子程序必须由其它子程序调用才能被执行。 子程序的调用方法与命令的调用方法完全一致 。虽然新建的子程序 ( 自定义子程序 ) 和事件子程序的调用方法一样 , 但它们之间也有一些不同之处。① 光 标 选 中子 程序 名 称 ,按 Enter键 添加一个参数。这 是 “ _ 按钮 1_被单击 ” 子程序的原型 , 没有参数。② 输 入 参 数名 称 并 设 置类 型 。 最 后按 F 5 键运行程 序 , 单 击“ 按钮 1 ” ,信 息 框 不 见了。信息框看不到的原因是 “ _ 按钮 1_被单击 ”子程序参数结构被改变 , 易语言就会把它当作新建的子程序 , 和 “ 按钮 1 ” 没有任何联系了 ,而新建子程序可以任意的添加参数 。 请大家自行总结一下新建的子程序和事件子程序的区别。268.4 子程序参数参数和变量的使用方法一样 , 可以使用赋值语句在 参数 内临时存储数据。 参数 有 参数名 (用来 在程序中 引用 一个参数 ) 、 数据类型 (确定 参数 能够存储数据的种类) 以及 “ 可空 ” 和 “ 参考 ” 等属性。参数只能在定义它的子程序中使用,相当于局部变量。① 把 8. 3 中 “ _ 按钮 1_被单击 ” 事件子程序的 “ 参数 1 ”删除。② 在 “ 信 息框 子程 序 ” 添加 两个 文 本 型参数 “ 参数 1 ”和 “ 参数 2 ” 。参数的 “ 类型 ” 属 性 可 为空。如果空 , 默认为 整数型 。③ 按 F5 键 , 程序无 法运行, 在输出 面板中可 以看到 出错提示 。这就 说明我们 还要在 调用上述 子程序 时提供具 体的参数。27④ 用 光 标 选 中 此行并双击 , 在括号内添加 “ , ” 号 , 按 Enter键。⑤ 看 到 了吗 ? 调 用 子程 序 的 命 令前 多 了 个“ + ” 号 ,我 们 可 以 将它展开。展 开 的 方法 : 直接双击或用 键 盘 上 的 右光标键。参 数 提 示 和 实际 参 数 的 内 容是互相对应的 ,在 上 面 添 加 文本型数据 “ 易语言 ” , 当程 序 运行时 , 下面 “ 参数 1 ” 保存的数据 就 是 “ 易 语言 ” 。① 接 下 来 我 们 在 程 序 中 为 子 程 序 提 供 具 体 的 参 数 数 据 。 用“ Ctrl+Tab” 组合键切换到界面设计状态,在窗体上添加两个标签和两个编辑框,并将标签的标题属性设置为 “ 输入 123” ,提示用户。这 是前 面提 到 的 “ 按钮 1 ” , 下面的是 “ 按钮 2 ” 。标 签 的 标题在此处设置 。28② 切换到代码编辑状态,在子程序调用处,分别为两个参数提供数据(编辑框提供的文本型数据 ) 。子程序如需要接收参数数据 , 必须先在子程序定义 处的 参数表部分定义 所需的参数 。 调用 有参数的 子程序时所传递过来的数据将被顺序地填入对应的参数中 。 如果传递过来的数据与对应位置处的参数数据类型不一致 , 在可以互相转换时 , 系统将自动 将传递过来的数据 转换 成对应参数的数据类型后再赋值给该参数 ; 如果不能转换,就 会产生运行时错误。如上面的第 2 步在调用子程序的同时就把 “ 编辑框 1 . 内容 ” 和 “ 编辑框 2 . 内容 ” 作为参数数据对应地传递到了 编辑框子程序 内的 两个 参数 “ 参数 1 ” 和 “ 参数 2 ” 内 。③ 修改 “ 信息框 子 程序 ” 代码。④ 按 F 5 键运行程序,在 “ 编辑框 1 ” 和 “ 编辑框 2 ” 中输入 “ 123” ,单击 “ 按钮 1 ” ,第一个信息框被弹出。你也可以输入其它的数据,看一看效果。298.5 参数的可空属性8.6 参数的参考属性参数 可空 ,就是 说该 参数是 可选的, 从字面 上就能 理解它 的意思 。就是在 调用子 程序时 ,可以 不提供 该参数所需的数据。看看下面的例子。如果 某个参数的 “ 可空 ” 属性为真,那么在调用本子程序时,可以不给此 参数传递数据 。可空的参数 主要用 于 支持具有默认值的参数 ;另外,如果给某个 子程序添加了新参数 却 又不想去更改以前调用此子程序的 代码,那么只要将新参数设置为可空参数就行了 。① 将 “ 参 数2 ” 可 空属 性选中 。 方法是 ,选 中 该 处 单元 格 再 单 击或 选 中 后 按空格键。② 把 调用 处的 “ 参 数 2 ”删除。30打个比方 ,你家的门锁有 两把钥匙,分别由 两个人拿着 。不管是哪一个人 都可以打开房门 ,改变家里家具 的摆放位置。如果 子过程的参数具 有 “ 参考 ” 属性,那 么,当调用子程序 时负责提供该参 数数据的是 一个变量的话,在 子程序中修改了 该参数的值,那个变量的值也会跟着被改变。① 在 “ _ 按钮 1_被单击 ” 事件子程序中添加两个局部变量。② 把编辑框提供的文本型数据转换到整数型。注意:文本 型数据 默认具 有参考 属性, 所以此例中为了演示参数的参考属性 , 把文本型数据转换到整数型。③ 添 加 信 息 框, 显示调用子程序后 , “ 变量 2 ” 的值。⑤ 添 加 代码, 修改 “ 参数 2 ” 的值。④ 将 “ 信 息框子 程序 ” 两个参 数的 类型改为整数型。