7.结构的使用
结构可以说一个数据与操作这些数据的函数结合体吧.比如,我们可以把"单位"看成一个结构.这个结构里面有最大生命值,当前生命值,最大魔法值,当前魔法值,坐标,移动速度等等的数据,还有设置生命,设置魔法,设置坐标,设置所属玩家等等函数.结构也正是Vjass的最强大的所在,因为结构为Vjass带来了面象对象设计.
先举一个例子来让我们见识一下结构吧:
jass: Copy code
struct pair
integer x
integer y
endstruct
function testpairs takes nothing returns nothing
local pair A=pair.create()
set A.x=5
set A.x=8
call BJDebugMsg(I2S(A.x)+" : "+I2S(A.y))
call pair.destroy(A)
endfunction
7.1声明一个结构
结构的声明用struct关键字.
jass: Copy code
struct struct_name
//some codes here
endstruct
7.2结构里的全局变量
结构里面是不可以放全局变量的,但是library里是可以的.library里也可以是全局数组.
jass: Copy code
//错误
struct zhuzhu
globals
boolean IsDead=false
integer array error
endglobals
endstruct
// 正确写法
library zhuzhu
globals
boolean IsDead=false
integer array no_error
endglobals
endlibrary
7.3结构里的函数与变量
结构里可以有各种各样的变量,甚至是一个结构类型.
jass: Copy code
struct apple
real height
boolean is_red
endstruct
struct zhuzhu
apple red_apple
integer age
integer array error //这一行错误,结构里不可以有数组类型
endstruct
可以看到,zhuzhu里面有两个变量,一个叫red_apple,是apple类型的.一个叫age,是integer类型的.我们还注意到,结构里面的变量前面不用加local修饰.
不过,虽然结构里的全局变量可以有数组类型,结构里的一般变量是不允许数组类型的.
结构里的函数一般叫方法,而不叫函数.用method关键字来声明.
jass: Copy code
struct apple
real height
boolean is_red
endstruct
struct zhuzhu
apple temp
integer age
method eat_apple takes apple temp returns nothing
if this.temp!=0 then
call BJDebugMsg("I've got a one")
else
call BJDebugMsg("Eat apples good for health")
endmethod
endstruct
//some codes
zhuzhu hldzhuzhu=zhuzhu.create()
call hldzhuzhu.eat_apple()
上面的代码中,我们先是声明了一个结构,叫做apple.之后又声明了一个结构,叫zhuzhu. zhuzhu里面有一个方法,叫eat_apple.这个方法里面,我们看到一个新的关键字:this.
this是一个指针,指向当前结构. this.temp就是指这个结构里的temp.如果不加this,那么就是指参数里面的那个temp.
最后面两行是如何创建一个结构实例和使用结构里的方法的.
就像:local timer t=CreateTimer()一样,结构也是要用一个特殊的方法来创建的.这个方法就是create,下面会讲到它,这里只需记住.
使用一个结构的方法,
用的是:结构实例名.结构方法名
而不是:结构名.结构方法名
所以,上面是:hldzhuzhu.eat_apple()
而不是zhuzhu.eat_apple(),就像你不能叫人去吃苹果,而必须说,张三,你去吃苹果,也就是必须指定某一个人
zhuzhu.create()特殊,下面讲.
7.4结构里的公有成员与私有成员
结构和上面所讲的库一样,也是有公有成员与私有成员的.默认的成员是公有的,加上private就变成私有的了,私有成员不能在外面被调用,私有变量也不能在外面被使用.
jass: Copy code
struct zhuzhu
private integer age
private method set_age taeks integer age returns boolean
if age>0 then
set this.age=age
return true
else
return false
endif
endmethod
method new_year_come takes nothing returns nothing
call this.set_age(this.age+1)
endmethod
endstruct
//some codes here
local zhuzhu hldzhuzhu=zhuzhu.create()
call hldzhuzhu.new_year_come() //正确,公有方法可以访问
call hldzhuzhu.set_age(19) //错误,私有方法不能访问
set hldzhuzhu.age=19 //错误,私有变量不能访问
7.5结构的构造函数
上面我们看到了一个奇怪的create函数,这个函数没有声明,就直接用了,而且不是通过"结构实例名.结构方法名"调用,而是通过"结构名.结构方法名"调用.这个函数就是构造函数,调用这个函数,才会生成一个结构实例,正如调用CreateTimer才会生成一个Timer一样.在一个结构里如果没有这个函数,系统会自动生成它.当然,我们可以自己写这个函数.不过,这个create函数的创建要符合下面的原则:
a.函数是一个static method
b.返回值是结构名
c.第一句要调用allocate函数
比如:
jass: Copy code
struct zhuzhu
private age
static method create takes integer age returns zhuzhu
//底层方法,返回一个zhuzhu实例
local zhuzhu temp=zhuzhu.allocate()
set temp.age=age //设置变量
return temp
endmethod
endstruct
//some codes here
local zhuzhu hldzhuzhu=zhuzhu.create(19)
create函数可以有参数,但是,create函数里面不可以使用this.
实际上,调用create时,结构实例还没有生成呢,变量也没有初始化,直到create调用完全,结构实例才得以生成,这时,this才有意义.
有时,结构里面还有结构,那么构造函数要对内层结构调用构造函数
jass: Copy code
struct apple
real height
boolean is_red
endstruct
struct zhuzhu
apple an_apple
integer age
static method create takes integer age returns zhuzhu
local zhuzhu temp=zhuzhu.allocate()//底层方法,返回一个zhuzhu实例
set temp.age=age //设置变量
set temp.an_apple=apple.create() //这里调用了apple的默认无参构造函数
return temp
endmethod
endstruct