教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 范文大全 > 资料大全 >

vJass系列教程9 面向对象编程(四) 操作符重载与虚拟属性

来源:网络收集 时间:2026-05-21
导读: 本系列教程不针对 Jass初学者,而针对具有一定Jass编程经验的读者。本教程将详细介绍 vJass的由来,语法特征,并且通过例子说明 vJass的应用和相对于普通 Jass的优势。 vJass 系列教程 9面向对象编程(四)操作符重载与虚拟属性Aeris NJU 2009/2/3 本系列教程不针

本系列教程不针对 Jass初学者,而针对具有一定Jass编程经验的读者。本教程将详细介绍 vJass的由来,语法特征,并且通过例子说明 vJass的应用和相对于普通 Jass的优势。

vJass 系列教程 9面向对象编程(四)操作符重载与虚拟属性Aeris NJU 2009/2/3

本系列教程不针对 Jass初学者,而针对具有一定Jass编程经验的读者。本教程将详细介绍 vJass的由来,语法特征,并且通过例子说明 vJass的应用和相对于普通 Jass的优势。

vJass 系列教程 9vJass 系列教程 9面向对象编程(四)操作符重载与虚拟属性操作符重载和虚拟属性都属于"虚拟语法",意思是说,它们可以使得一些原本不适用于这种类型对象 的语法成为合法的. 操作符重载 背景 操作符重载有什么用?在教程 8 的最后,我向各位读者展示了 vJass 作者写的一个表格系统例子.我们 首先关注一下这个表格系统怎么使用: set t = Table.create() set i = t[1234567] set t[12341] = 32 call t.flush(12341) t.exists(32) call t.reset() call t.destroy() 我们特别注意有灰色背景的那两行.第一行试图获取 t[1234567]的值,第 2 行给索引 12341 赋值为 32. t 是什么?数组吗?我们知道,[](中括号)是访问数组元素的操作符.可是,再看看前面: set t = Table.create() // 创建一个新的表格对象 原来 t 不是数组,是一个表格对象!为什么表格对象可以使用[]操作符呢?因为在表格对象的定义中重 载了操作符.表格结构重新实现了"[]"(访问数组元素)和"[]="(数组元素赋值)操作符,所以, 我们可以使用和访问数组元素一样的方法来访问表格的元素. 语法和用处 vJass 允许重载的操作符目前有 3 个(0.9.E.0 版): [] 数组元素读取 // 创建一个新的表格对象 // 获取键1234567对应的值(如果不存在返回0) // 给键12341赋值32 // // // // // 清除键12341对应的游戏缓存 32这个键有没有对应的值? 清除表格的所有内容 销毁表格对象 注意销毁表格并不清除表格里的内容,要清除内容,调用reset[]= 数组元素赋值 < 比较操作符(不完善)2

本系列教程不针对 Jass初学者,而针对具有一定Jass编程经验的读者。本教程将详细介绍 vJass的由来,语法特征,并且通过例子说明 vJass的应用和相对于普通 Jass的优势。

vJass 系列教程 9 因为比较操作符的支持还不完善,故暂不介绍.重点介绍数组元素读取和赋值操作符. 要想使自己写的结构对象用起来"就像一个数组一样",可以用[]去获取和赋值,就必须在结构里提供 数组操作符的定义.也就是提供操作符重载.操作符重载的一般语法如下: method operator 操作符 takes 参数 returns 返回值类型 // 正常的方法体 endmethod 可以看到,重载操作符和方法定义很类似,因为本质上,操作符也是一种函数. 为什么这么说?请看下表: 正常的 Jass 语法 "函数化"的写法(非 Jass 语法) 等价的函数写法 set i = 1 + 1 set i = +(1, 1) set i = add(1, 1) set j = intArray[5] set j = [](intArray, 5) set j = get(intArray, 5) if a > b then if >(a, b) then if greater(a, b) then 把第 2 列的+,[],>等符号替换成函数名,就是合法的写法了(第 2 行的数组操作只有在 vJass 中针对 动态数组才合法). 好,我们回到重载操作符的语法.前面说了重载操作符的语法和定义方法的语法类似,但是,重载操作 符的参数和返回值必须遵循该操作符的规律,不能随便改动.比如[]操作符只能有一个参数,写两个参 数就是非法,比较操作符必须返回布尔值,返回其他值也是非法. 下表是重载操作符的语法: // 读取数组元素,必须接受1个参数,返回1个值 method operator [] takes 索引类型 参数名 returns 返回值类型 // 数组元素赋值,必须接受2个参数,没有返回值 method operator []= takes 索引类型 参数名, 值类型 参数名 returns nothing // 比较操作符,必须接受1个参数,必须返回布尔类型 method operator < takes 另一个对象类型 参数名 returns boolean 以下是一些合法的定义: method operator [] takes string index returns string // 以后可以这样调用(假设obj是实现了这个操作符的结构对象) set str = obj["Hello"] // 如果这样调用的话,那么index就是字符串"Hello",返回值赋给str method operator []= takes string index, integer n returns nothing // 以后可以这样调用(假设obj是实现了这个操作符的结构对象) set obj["Hello"] = 5 // 如果这样调用的话,那么index就是字符串"Hello",n就是整数5 完整的例子见教程 8 最后的表格系统.3

本系列教程不针对 Jass初学者,而针对具有一定Jass编程经验的读者。本教程将详细介绍 vJass的由来,语法特征,并且通过例子说明 vJass的应用和相对于普通 Jass的优势。

vJass 系列教程 9 操作符重载的目的是:使我们能够以一种更加自然的方式去使用一些结构的对象(例如表格也是"索引 –值"对的形式,使用和访问数组一样的写法就很自然).除此之外,它和一般的函数没有任何区别. 虚拟属性 背景 这是另一个使得结构使用起来"更加自然"的语法,和操作符重载一样,它的功能和一般函数相同. 我们知道,可以用.(点操作符)访问一个结构中的成员变量(属性),例如: set goblin.goldCost = 120 set goblin.lumberCost = 20 这里我们设置 goblin 对象的 goldCost 属性为 120,lumberCost 属性为 20.为了使得语义正确,goblin 对 象的所属结构(假设是 Goblin)必须定义两个属性:goldCost 和 lumberCost,就像这样: struct Goblin integer goldCost integer lumberCost // 其他定义 endstruct 否则会报错:找不到某某成员. 那么,什么是虚拟属性呢?顾名思义,虚拟属性就是本来不存在,"虚拟"的一个属性.也就是说,我 们可以用访问属性的语法,去调用一个函数,"用起来就像是访问属性一样". 我们来看一个例子:现在我们需要一个结构来表示时间间隔,时间间隔的单位有时,分,秒(再大或者 再小的不考虑),我们也需要计算这段时间间隔大概是多少小时,多少分,多少秒,一个很自然的设计 如下: // 时间间隔结构 struct Duration // 这段时间间隔的秒数,内部以秒来计算 private integer secondCount // 获取秒数 method getSec takes nothing returns integer return .secondCount endmethod // 设置秒数 method setSec takes integer sec returns nothing set .secondCount = sec endmethod // 获取分钟数4

本系列教程不针对 Jass初学者,而针对具有一定Jass编程经验的读者。本教程将详细介绍 vJass的由来,语法特征,并且通过例子说明 vJass的应用和相对于普通 Jass的优势。

vJass 系列教程 9 method getMin takes nothing returns integer return .secondCount / 60 endmethod // 获取秒数 method getHour takes nothing returns integer return .secondCount / 3600 endmethod endstruct 我们可以这样使用: local Duration dur set dur = Duration.create() call dur.setSec(86400) call BJDebugMsg("Sec: " + I2S(dur.getSec())) // 打印出86400 call BJDebugMsg("Min: " + I2S(dur.getMin())) // 打印出1440 call BJDebugMsg("Hour: " + I2S(dur.getHour())) // 打印出24 这没什么问题,可是我们也可以换一种写法(注意不同之处,用灰色背景标出): // 时间间隔结构 st …… 此处隐藏:4480字,全部文档内容请下载后查看。喜欢就下载吧 ……

vJass系列教程9 面向对象编程(四) 操作符重载与虚拟属性.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/fanwen/2190539.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)