【quick-cocos2d-x】Lua 面向对象(OOP)编程与元表元方法
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 -- 定义一个表来模拟对象,将id和name看成的它的属性
local person = {id = 2156,name = "yzn",}
-- 给对象添加方法
function person.sayHello(self)
print("你好,我的名字是" .. self.name)
end
- - 访问属性
print(person.id)
- - 调用方法
person:sayHello()
接下来我们来访问person的属性和调用sayHello方法。发现无论是语法还是效果上面都和Java等其它语言操作对象的方式极其类似。但是值得注意的是我在调用方法的时候person后面用的是冒号(:)来调用sayHello方法,而不是使用一点。这其实是Lua的一个语法糖衣,使用冒号调用的时候Lua会自动将调用者当成函数的第一个参数的实参传递到函数内部去。所以我就没有传递参数给sayHello的self参数那边。 person:sayHello()
与 person.sayHello(person)
是一样的效果,冒号和点号只是用来决定是否需要手动传递第一个参数而已。 -- 定义一个Person表,当成类。添加一个属性id,和一个方法toString
Person = {
id = "1",toString = function(p)
print("id = ",p.id)
end
}
-- 给Person再添加一个new函数,用于实例化对象。
function Person.new()
-- 定义一个表,当成被实例化出来的对象
obj = {}
-- 设置表的元表
setmetatable(obj,Person)
-- 设置__index方法为自身
Person.__index = Person
-- 返回创建的实例对象
return obj
end
-- 调用new函数实例化对象
local obj = Person.new()
-- 访问属性
print("obj.id = ",obj.id)
-- 调用方法
obj:toString()
其实Lua中就是通过设置元表的方式来实现继承关系的,这里所谓的类和对象,其实就是让一个obj表继承Person这个表(设置obj的元表为Person)。然后设置元方法__index为Person,这样我们访问obj的id属性时,它在自己的表中没有找到就会调用元方法__index去元表里面找,也就是去Person里面去找,然后返回了Person的id属性的值,方法调用也是一样的。如果没有设置__index,那么没有找到会直接返回nil。 local tab1 = {1,2,3}
print(getmetatable(tab1)) -- 输出nil
其实所谓的元表就是一个普通的表,我们现在来设置下tab1的元表: local tab1 = {1,3}
-- 定义一个普通的空表作为元表
local mt = {}
setmetatable(tab1,mt)
print(getmetatable(tab1)) -- 输出table
我们甚至可以给上面的mt添加一个项,然后获取出tab1的元表进行dump查看是否就是mt: local tab1 = {1,3}
-- 定义一个普通的空表作为元表
local mt = { id = 7,}
setmetatable(tab1,mt)
dump(getmetatable(tab1)) -- 输出表里面的所有内容
我在quick-player模拟器上面运行,控制台窗口输入的内容如下图所示。 local tab1 = {"a","b","c"}
-- 定义一个普通的空表作为元表
local mt = {}
-- 设置tab1的元表为mt
setmetatable(tab1,mt)
-- 重写元方法
mt.__add = function(t1,t2)
local t = {}
for i,v in ipairs(t1) do
table.insert(t,v)
end
for i,v in ipairs(t2) do
table.insert(t,v)
end
return t
end
-- 定义另一个table
local tab2 = {"d","e",}
-- 对tab进行加法运算,会触发__add元方法
local tab3 = tab1 + tab2
-- 打印计算后的结果
dump(tab3)
运行后看到打印的tab3的值如下所示: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |