(Lua中的类 - 1)在Lua中实现类
2017-02-21 本文已影响101人
qufl
-- 包含一些实现类的示例
--[[
table中查找字段name的过程:
1.table是否有字段name:是,则返回name;否,则进入下一步
2.table是否设置了metatable:是,则下一步;否,则返回nil
3.table的metatable是否有__index字段:是,则下一步;否,则返回nil
4.table的metatable中的__index是否有name字段,是则返回__index.name;否,则返回nil
]]
--[[
1.使用metatable实现类
原理:
使用metatable中的__index字段,指向一个table名为A,A中包含了一些属性和方法。
新建一个对象,即构造了一个新的table名为B,并将B的metatable设置为A,这样B就可以访问A中的属性和方法
]]
-- Person类
Person = {}
Person.__index = Person --元表的__index字段很重要
Person.name = ""
Person.age = 0
function Person:new()
local obj = {}
setmetatable(obj, Person)
return obj
end
function Person:say(words)
print(words or "Hello")
end
-- 实现一个Person类的对象
local me = Person.new()
print(me.name) -- 输出空字符串
print(me.age) -- 输出0
me:say() -- 输出Hello
me.name = nil
print(me.name) -- me这个table本身就没有name字段,所以上面给name置为nil后,这里访问到的仍然是metatable中的name
me.name = "xiaoming"
print(me.name) -- 这里访问到的是me这个table自己的name字段
print(me:say("I am xiaoming.")) -- 调用的还是metatable的say函数
--[[
总结:
所谓的类,实际是通过metatable给一个table提供(规定)了一些默认的属性和方法。
当这个table自己有某个字段时,访问到的就是这个table自己的字段和方法。
否则,访问的是metatable提供的默认字段。
]]