类与对象
轻语言支持面向对象开发。
在轻语言安卓与视窗项目中,每个 .spl 文件是一个包含界面设计的窗口类,每个 .spc 文件是一个不包含界面设计的纯代码数据类,与 Java 中的 Class 完全一样。
类的定义
在轻语言中,规定以 .spc 作为后缀的文件为一个纯代码数据类文件,其文件名为类名,例如:学生.spc 表示一个学生类。
类的代码结构
一个标准的轻语言类包含:
-
类名 等于文件名。
-
属性/字段 类成员变量,描述对象特征,定义在类内部、函数外部。
-
函数 描述类的功能。
-
构造函数 创建类的对象时初始化类中属性的特殊函数。
扩展特性包含:
-
@继承 指定类的父类,指定后可以继承其父类所有可被继承的成员。
-
@实现 在类中实现指定的接口。
代码示例
类文件:学生.spc
' 定义属性字段
变量 姓名 为 文本型
变量 年龄 为 整数型
变量 学号 为 整数型
' 构造函数,创建对象时初始化属性,无参构造,默认存在
函数 学生()
结束 函数
' 有参构造,创建对象时通过外部传入的参数值初始化设置属性值
函数 学生(参_姓名 为 文本型,参_年龄 为 整数型,参_学号 为 整数型)
本对象.姓名 = 参_姓名
本对象.年龄 = 参_年龄
本对象.学号 = 参_学号
结束 函数
' 普通函数,描述这个类可以做什么,有什么功能
函数 写作业()
调试输出(姓名 + "正在写作业")
结束 函数
代码解释:
- 成员变量
姓名/年龄/学号:属于每个学生对象的专属属性,不同对象的属性值可以不同。
- 构造函数
- 无参构造
学生():没有参数,创建对象时属性默认值(文本型 是 空,整数型 是 0),需要手动赋值。 - 有参构造
学生(参_姓名 为 文本型,参_年龄 为 文本型,参_学号 为 文本型):创建对象时直接传值,本对象.姓名表示当前对象的姓名属性,区分方法参数和成员变量。
- 无参构造
- 成员函数
写作业对象可以执行的行为,或描述对象的功能,函数中可以直接使用成员变量。
使用类
定义类之后,如何使用类呢?以视窗程序为例:
事件 按钮1.被单击(来源对象 为 对象,事件对象 为 鼠标事件)
' 使用无参构造函数,创建的对象“学生1”相关属性均为空
变量 学生1 = 创建 学生()
' 需要我们手动挨个设置
学生1.姓名 = "张三"
学生1.年龄 = 10
学生1.学号 = 20
' 调用写作业函数
学生1.写作业()
' 使用有参构造函数创建对象,创建的对象“学生2”相关属性在构造函数中设置
' 姓名:王五,年龄:12,学号:30
变量 学生2 = 创建 学生("王五",12,30)
学生2.写作业()
结束 事件
继承
继承是指子类继承父类的属性和方法,减少重复代码,在轻语言中用 @继承 关键字指定要继承的父类,每个子类只能继承一个父类。
代码示例
父类:动物.spc
' 定义动物的名称
变量 名称 为 文本型
' 定义动物的行为,可以逃跑,假设被发现
函数 逃跑()
调试输出(名称 + " 被发现后,疯狂在逃跑!")
结束 函数
' 定义动物的行为,当被逮住时开始叫唤,子类可重写该函数,以实现不同的动物,叫唤的声音不一样
函数 被逮住时叫唤()
调试输出(名称 + " 被逮住!")
结束 函数
子类:猫头鹰.spc
@继承 动物
' 重写父类被逮住时的叫唤函数,猫头鹰叫声一般多为:咕咕咕咕
函数 被逮住时叫唤()
调试输出(名称 + " 被逮住!发出:咕咕、咕咕、咕咕、呱啊、呱啊")
结束 函数
子类:小野兔.spc
@继承 动物
' 重写父类被逮住时的叫唤函数,小野兔叫声一般多为:吱吱叽叽
函数 被逮住时叫唤()
调试输出(名称 + " 被逮住!发出:吱吱、叽叽")
结束 函数
使用示例:
事件 按钮2.被单击(来源对象 为 对象,事件对象 为 鼠标事件)
变量 猫头鹰1 = 创建 猫头鹰()
' 继承自动物,动物类有一个名称属性,因此猫头鹰也可以使用名称
猫头鹰1.名称 = "猫头鹰1"
猫头鹰1.被逮住时叫唤()
' 小野兔也继承自动物,因此小野兔也可以使用名称属性
变量 小野兔1 = 创建 小野兔()
小野兔1.名称 = "小野兔1"
小野兔1.被逮住时叫唤()
结束 事件
接口与实现
接口是什么?
接口的主要核心作用:
-
在不改变原有类的特性的前提下,扩展为其添加新的特性。
-
统一规范值的类型,所有实现接口的类,都可以通过其对象调用接口函数。
实际运用场景
1.为类扩展新特性
早期汽车不能飞,现在新的汽车有的能飞,但是汽车类的定义已经固定,不能直接修改汽车这个类,而能飞的汽车种类太多,直接给每个能飞的汽车里面添加单独的飞行函数耦合度又太高,假设现在有个需求,需要展示出一个集合中所有能飞的汽车?如果使用接口就会方便很多。
代码示例
测试程序集文件:接口测试.ass
定义 飞行功能 为 接口
回函 怎么飞()
结束 定义
定义 汽车 为 类型
变量 名称 为 文本型
结束 定义
定义 普通小车 继承 汽车
结束 定义
定义 熊猫飞行汽车 继承 汽车 实现 飞行功能
函数 怎么飞()
调试输出("用螺旋桨飞")
结束 函数
结束 定义
定义 企鹅飞行汽车 继承 汽车 实现 飞行功能
函数 怎么飞()
调试输出("用喷气式引擎飞")
结束 函数
结束 定义
使用:
事件 按钮3.被单击(来源对象 为 对象,事件对象 为 鼠标事件)
' 创建汽车对象添加到集合中
变量 集合1 = 创建 集合()
集合1.添加项目(创建 普通小车())
集合1.添加项目(创建 熊猫飞行汽车())
集合1.添加项目(创建 企鹅飞行汽车())
变量循环(i = 0,i<集合1.取项目数(),1)
如果(集合1.取项目(i) 类属 飞行功能)
飞行功能 能飞的车 = (飞行功能)集合1.取项目(i)
能飞的车.怎么飞()
结束 如果
结束循环
结束 事件
2.统一规范值的类型
假设现在您做了一个项目,这个项目里面有很多类,现在有一个需求:需要调试输出不同的类型的对象测试信息,传统的方式是给每个类里面添加一个函数,然后再通过每个类的对象调用,如果使用接口就可以规范这个函数。
代码示例
测试程序集文件:测试.ass
定义 信息调试 为 接口
回函 打印测试信息()
结束 定义
定义 人员 为 类型 实现 信息调试
变量 姓名 为 文本型
函数 人员(姓名 为 文本型)
本对象.姓名 = 姓名
结束 函数
函数 打印测试信息()
调试输出("人员信息")
结束 函数
结束 定义
定义 车辆 为 类型 实现 信息调试
变量 型号 为 文本型
函数 打印测试信息()
调试输出("车辆信息")
结束 函数
结束 定义
使用
函数 打印对象信息(目标对象 为 信息调试)
目标对象.打印测试信息()
结束 函数
事件 按钮3.被单击(来源对象 为 对象,事件对象 为 鼠标事件)
变量 人员1 = 创建 人员("张三")
打印对象信息(人员1)
结束 事件