lua实现多继承

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()

转载于:https://my.oschina.net/u/156466/blog/401576

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值