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

--[[
创建一个类的方法
原理:
    一个类,本质上也是一个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)封装一个生成类的函数)