vJass系列教程9 面向对象编程(四) 操作符重载与虚拟属性.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:7 大小:223KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

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

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

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

`vJass系列教程9面向对象编程(四)操作符重载与虚拟属性Aeris`NJU`2009/2/3`vJass系列教程9vJass系列教程9面向对象编程(四)操作符重载与虚拟属性操作符重载和虚拟属性都属于“虚拟语法”,意思是说,它们可以使得一些原本不适用于这种类型对象的语法成为合法的。操作符重载背景操作符重载有什么用?在教程8的最后,我向各位读者展示了vJass作者写的一个表格系统例子。我们首先关注一下这个表格系统怎么使用:sett=Table.create()//创建一个新的表格对象seti=t[1234567]//获取键1234567对应的值(如果不存在返回0)sett[12341]=32//给键12341赋值32callt.flush(12341)//清除键12341对应的游戏缓存t.exists(32)//32这个键有没有对应的值?callt.reset()//清除表格的所有内容callt.destroy()//销毁表格对象//注意销毁表格并不清除表格里的内容,要清除内容,调用reset我们特别注意有灰色背景的那两行。第一行试图获取t[1234567]的值,第2行给索引12341赋值为32。t是什么?数组吗?我们知道,[](中括号)是访问数组元素的操作符。可是,再看看前面:sett=Table.create()//创建一个新的表格对象原来t不是数组,是一个表格对象!为什么表格对象可以使用[]操作符呢?因为在表格对象的定义中重载了操作符。表格结构重新实现了“[]”(访问数组元素)和“[]=”(数组元素赋值)操作符,所以,我们可以使用和访问数组元素一样的方法来访问表格的元素。语法和用处vJass允许重载的操作符目前有3个(0.9.E.0版):z[]数组元素读取z[]=数组元素赋值z<比较操作符(不完善)`2`vJass系列教程9因为比较操作符的支持还不完善,故暂不介绍。重点介绍数组元素读取和赋值操作符。要想使自己写的结构对象用起来“就像一个数组一样”,可以用[]去获取和赋值,就必须在结构里提供数组操作符的定义。也就是提供操作符重载。操作符重载的一般语法如下:methodoperator操作符takes参数returns返回值类型//正常的方法体endmethod可以看到,重载操作符和方法定义很类似,因为本质上,操作符也是一种函数。为什么这么说?请看下表:正常的Jass语法“函数化”的写法(非Jass语法)等价的函数写法seti=1+1seti=+(1,1)seti=add(1,1)setj=intArray[5]setj=[](intArray,5)setj=get(intArray,5)ifa>bthenif>(a,b)thenifgreater(a,b)then把第2列的+、[]、>等符号替换成函数名,就是合法的写法了(第2行的数组操作只有在vJass中针对动态数组才合法)。好,我们回到重载操作符的语法。前面说了重载操作符的语法和定义方法的语法类似,但是,重载操作符的参数和返回值必须遵循该操作符的规律,不能随便改动。比如[]操作符只能有一个参数,写两个参数就是非法,比较操作符必须返回布尔值,返回其他值也是非法。下表是重载操作符的语法://读取数组元素,必须接受1个参数,返回1个值methodoperator[]takes索引类型参数名returns返回值类型//数组元素赋值,必须接受2个参数,没有返回值methodoperator[]=takes索引类型参数名,值类型参数名returnsnothing//比较操作符,必须接受1个参数,必须返回布尔类型methodoperator<takes另一个对象类型参数名returnsboolean以下是一些合法的定义:methodoperator[]takesstringindexreturnsstring//以后可以这样调用(假设obj是实现了这个操作符的结构对象)setstr=obj["Hello"]//如果这样调用的话,那么index就是字符串"Hello",返回值赋给strmethodoperator[]=takesstringindex,integernreturnsnothing//以后可以这样调用(假设obj是实现了这个操作符的结构对象)setobj["Hello"]=5//如果这样调用的话,那么index就是字符串"Hello",n就是整数5完整的例子见教程8最后的