Lua点滴LuaLua脚本语言开发

(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提供的默认字段。
]]

上一篇下一篇

猜你喜欢

热点阅读