美文网首页Lua点滴LuaLua脚本语言开发
(Lua中的类 - 4)封装一个生成类的函数

(Lua中的类 - 4)封装一个生成类的函数

作者: qufl | 来源:发表于2017-02-22 16:18 被阅读111次
    --[[
    创建一个类的方法
    原理:
        一个类,本质上也是一个table,只是他包含了__index键,而且__index键指向它本身。
        创建一个类的对象,即新建一个table,并且将类(一个table)设置为其metatable。
    参数:
        name->类名(string类型值,必需)
        super->父类列表(table类型值或nil,非必需)
    ]]
    function class(name, super)
        -- name必须是一个string
        if not name or type(name) ~= "string" then
            error("Name of class should be a string value.")
        end
        -- super如果有,必须是一个table,使用多继承的形式
        if not super then
            super = {}
        else
            if type(super) ~= "table" then
                error("Super of class should be a table value.")
            end
        end
    
        -- 生成一个多继承的类
        local myClass = {}
        myClass._className = name   -- 保存ClassName
        myClass._super = super      -- 保存父类列表
    
        myClass.__index = myClass
        setmetatable(myClass, {__index = function(tab, key) -- 元表的__index是从super列表中查找key
            for k,v in pairs(myClass._super) do
                if v[key] then
                    return v[key]
                end
            end
        end})
    
        -- new函数
        function myClass:new()
            local obj = {}
            setmetatable(obj, myClass)
            return obj
        end
    
        -- release函数,只是想写个release,感觉没什么意义
        function myClass:release()
            myClass = nil
        end
    
        -- 获取类型,只是因为保存了className,所以加了个函数,并没有觉得有什么意义
        function myClass:getClass()
            return myClass._className
        end
    
        -- 获取父类列表,同上只是因为保存了super列表
        function myClass:getSuper()
            return myClass._super
        end
    
        return myClass
    end
    
    
    -- 下面是测试代码
    
    -- 新建一个普通的类,不需要再手动写new方法了
    Person = class("Person")    -- 没有父类
    
    function Person:say()
        print("Person say")
    end
    
    -- 继承一个类
    Worker = class("Worker", {Person})  -- 父类是Person
    
    function Worker:work()
        print("Worker work")
    end
    
    -- 多继承呢
    Coder = class("Coder", {Person, Worker})    -- 父类是Person和Worker
    
    function Coder:coding()
        print("Coder coding")
    end
    
    -- 创建一个Coder类的对象
    local me = Coder:new()
    me:say()    -- Person的say,虽然Worker也有say,但是父类列表中Person在前,在__index中是先找Person类
    me:work()   -- Worker的work
    me:coding() -- Coder的coding
    
    print(me:getClass())
    print(#me:getSuper())
    
    me:release()
    
    

    相关文章

      网友评论

        本文标题:(Lua中的类 - 4)封装一个生成类的函数

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