美文网首页Lua点滴LuaLua脚本语言开发
(Lua中的类 - 3)在Lua中实现类的多继承

(Lua中的类 - 3)在Lua中实现类的多继承

作者: qufl | 来源:发表于2017-02-21 18:15 被阅读53次
    --[[
    3.使用metatable的__index来从多个table中查找key,实现多继承
    原理:
        在类的继承的基础上实现多继承,实际就是将metatable的__index设置为一个可以在多个table中查找key的函数即可。
        如果有一个类A,想要集成类B和C,我们可以在类A中将B和C保存起来。
        然后给A设置一个metatable,metatable的__index字段为一个函数,这个函数从类A保存的B和C中去查找需要的字段。
    ]]
    
    -- 这里实现一个示例,Person、Woker、Coder分别是一个类,Coder集成自Person和Worker类
    
    -- Person类
    Person = {}
    Person.__index = Person
    
    Person.name = "Person"
    Person.age = 0
    
    function Person:new()
        local obj = {}
        setmetatable(obj, Person)
        return obj
    end
    
    
    -- Worker类
    Worker = {}
    Worker.__index = Worker
    
    Worker.dept = "Department"
    Worker.level = 1
    
    function Worker:new()
        local obj = {}
        setmetatable(obj, Worker)
        return obj
    end
    
    function Worker:work()
        print("I am working.")
    end
    
    
    -- Coder类
    Coder = {}
    Coder.__index = Coder
    
    Coder.parents = {Person, Worker}    -- 父类的列表
    setmetatable(Coder, {__index = function(tab, key)   -- 本类的metatable不是任何一个父类,__index是一个用于查找key的函数
        for k,v in pairs(Coder.parents) do
            if v[key] then
                return v[key]
            end
        end
    end})
    
    Coder.proj = "slither"
    
    function Coder:new()
        local obj = {}
        setmetatable(obj, Coder)
        return obj
    end
    
    function Coder:work()   -- 相当于重写Worker中的work方法,实际是Coder有了work方法之后就不会去到Worker中查找work方法了
        print("I am coding.")
    end
    
    -- 新建一个Coder类的对象
    local me = Coder:new()
    print(me.name)  -- Person中的name字段
    print(me.age)   -- Person中的age字段
    print(me.dept)  -- Worker中的dept字段
    print(me.level) -- Worker中的level字段
    print(me.proj)  -- Coder中的proj字段
    me:work()   -- Coder中的work函数
    
    
    

    相关文章

      网友评论

        本文标题:(Lua中的类 - 3)在Lua中实现类的多继承

        本文链接:https://www.haomeiwen.com/subject/tsvuwttx.html