lua实现多继承

2016-06-18  本文已影响0人  lxfeng

lua对于面向对象的支持主要通过table来实现,每个table都是一个对象,对于继承,lua有元表的机制,通过setmetatble()可以来修改元表,

元表是什么?

元表其实就是在本身找不到的东西,就会去元表中查找。

__index元方法:

__index方法是用来确定一个表在被作为元表时的查找方法。它的值可以使函数也可是是table,一般用法为:

<!-- lang: lua -->
local obj = {}
setmetatable(obj, {__index = xx})   --这样便实现了obj实现继承自xx。

对于多继承,原理就是遍历多个父类的,代码如下:


<!-- 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

结果输出:

class1:print()

class2:print()

上一篇 下一篇

猜你喜欢

热点阅读