Lua面向对象编程

来源:互联网 发布:网络功放系统 编辑:程序博客网 时间:2024/05/05 06:29

很多游戏都开始使用lua脚本了。以我来说,我刚工作时Lua脚本还只是大量的用在UI上,UI对面向对象编程还没有那么大的诉求,只是很脏的业务逻辑。之后开发的游戏已经完全让Lua来处理游戏逻辑了,这也是各种热更的需要,这时对面向对象的需求就大大增加了,比如游戏中有上百个NPC我们不能为每一个NPC都写一套逻辑,那简直就是噩梦,简直比喝一箱白花蛇草水还要caodan惊恐。还要借助oo思想,为所有NPC搞个基。搞个基类微笑。好言归正传,下面就讲解一下如何用Lua来写oo。

首先,要了解一下在Lua中oo实现的基础--table(没错,就是table,也是Lua的精髓),metatable(就是一个隐形table,能用setmetatable()设置,用getmetatable()取得),__index(metatable的一个key)。

这三者的关系是这样的:以索引一个tab中的值(index)为例,当tab[index] 时,先去tab中查找这个key,如果有则返回tab[index],如果没有则查找有没有metatable,没有则返回nil,有则查找metatable中有没有__index这个键,没有返回nil,有则在__index中查找。

所以__index是一个表,且__index是metatable表中的一个元素,metaltable表可以用setmetatable()附加给一个表。

所以,我们可以试着写一个类

classA = 
{
a = 0,
b = 0,
new = function(self,varA,varB) 构造函数
-- body
self.a = varA
self.b = varB
print("classA struction!")
local tab = {}
setmetatable(tab,self)
return tab
end,
}
classA.__index = classA --这句话的原因是因为setmetatable时 classA是metatable 所以他必須有一个__index

local test = classA:new(1,2)

print(test.a,test.b) 

//输出结果是1,2

这样看起来跟c++中的不一样,我们可以换一种写法:

classA = 
{
a = 0,
b = 0,
}

function classA:new(varA,varB) --用“:”默认传递self
-- body
self.a = varA
self.b = varB
print("classA struction!")
local tab = {}
setmetatable(tab,self)
return tab
end,
classA.__index = classA

local test = classA:new(1,2)

print(test.a,test.b) 

//输出结果一样
0 0