lua實現多繼承

lua對於面向對象的支持主要經過table來實現,每一個table都是一個對象,對於繼承,lua有元表的機制,經過setmetatble()能夠來修改元表, #元表是什麼? 元表其實就是在自己找不到的東西,就會去元表中查找。 #__index元方法: __index方法是用來肯定一個表在被做爲元表時的查找方法。它的值能夠使函數也但是是table,通常用法爲:函數

<!-- lang: lua -->
local obj = {}
setmetatable(obj, {__index = xx})   --這樣便實現了obj實現繼承自xx。

對於多繼承,原理就是遍歷多個父類的,代碼以下:lua


<!-- lang: lua -->
local class1 = {}
function class1:new()
    local obj = {}
    setmetatable(obj, {__index= class1})
    return obj
end

function class1:print1()
    print("class1:print()")
end


local class2 = {}
function class2:new()
    local obj = {}
    setmetatable(obj, {__index= class2})
    return obj
end

function class2:print2()
    print("class2:print()")
end

function super(k, list)
    for i,v in ipairs(list) do
        local ret = v[k]
        if ret then
            return ret
        end
    end
end


local class3 = {}
function class3:new()
    local obj = {}
    local  base = {class1, class2}
    --t爲調用的對象,k爲方法名
    setmetatable(class3, {__index= function(t,k) return super(k, base) end})
    setmetatable(obj, {__index = class3})
    return obj
end

結果輸出:code

class1:print()對象

class2:print()繼承

相關文章
相關標籤/搜索