Lua 类管理器

Lua 类管理器

lua 复制代码
-- ***** Class Manager 类管理*****'

local ClassManager = {}

local this = ClassManager

function ClassManager.Class(className, ...)

    print('ClassManager::Class')
    --print(className)
    
    -- 构建类
    local cls = {__className = className}
    --print(cls)
    -- 父类集合
    local supers = {...}
    for _, super in pairs(supers) do
        -- 获取父类的类型
        local superType = type(super)
        --print(superType)
        assert(superType == nil or superType == 'table' or superType == 'function',
                string.format("class() - create class \"%s\" with invalid super class type \"%s\"",
                        className, superType))

        if superType == 'function' then
            assert(cls.__create == nil, string.format("class() - create class \"%s\" with more than one creating function",
                    className))
            cls.__create = super

        elseif superType == 'table' then
            if super['.isclass'] then
                assert(cls.__create == nil,
                        string.format("class() - create class \"%s\" with more than one creating function or native class",
                                className));

                cls.__create = function() super:create() end
            else
                -- 用来保存父类
                cls.__supers = cls.__supers or {}
                local dp = false
                for _, v in pairs(cls.__supers) do
                    if v.__className == super.__className then
                        dp = true
                        break
                    end
                end

                -- set first super pure lua class as class.super
                if not dp then
                    -- 将父类中所有的对象(变量或者函数)拷贝到子类中
                    cls.__supers[#cls.__supers + 1] = super
                    if not cls.super then
                        cls.super = super
                    end
                end

            end

        else
            error(string.format("class() - create class \"%s\" with invalid super type",
                    className), 0)
        end
    end



    cls.__index = cls

    if not cls.__supers or #cls.__supers == 1 then
        setmetatable(cls, {__index = cls.super})
    else
        -- 设置cls的元表为supers中的父类
        setmetatable(cls, {__index = function(_, key)
            local supers = cls.__supers
            for i=1, #supers do
                local super = supers[i]
                if super[key] then return super[key] end
            end
        end})
    end

    -- 添加默认构造函数
    if not cls.constructor then
        cls.constructor = function() end
    end

    -- new 方法构建类对象
    cls.new = function(...)
        -- 构建一个对象
        local instance
        if cls.__create then
            instance = cls.__create(...)
        else
            instance = {}
        end

        -- 设置对象的元表为当前类
        setmetatable(instance, cls)
        instance.class = cls
        instance:constructor(...)
        return instance

    end

    cls.create = function(_, ...)
        return cls.new(...)
    end

    -- 返回类
    return cls

end

local setmetatableindex = function(t, index)
    local mt = getmetatable(t)
    mt = mt or {}
    if not mt.__index then
        mt.__index = index
        setmetatable(t, mt)
    elseif mt.__index ~= index then
        setmetatableindex(mt, index)
    end
end

return ClassManager

使用

lua 复制代码
local MyObject = require('MyObject')
local ClassManager = require('ClassManager')
local obj3 = ClassManager.Class('obj3', MyObject)
--print(obj3)
obj3:myFunc()
obj3:myFunc2()
相关推荐
鬼圣17 小时前
Python 上下文管理器
开发语言·python
星空椰17 小时前
JavaScript 基础进阶:分支、循环与数组实战总结
开发语言·javascript·ecmascript
yong999017 小时前
IHAOAVOA:天鹰优化算法与非洲秃鹫优化算法的混合算法(Matlab实现)
开发语言·算法·matlab
t***54417 小时前
有哪些常见的架构设计模式在现代C++中应用
开发语言·c++
人间打气筒(Ada)18 小时前
「码动四季·开源同行」python语言:用户交互
开发语言·python·基本数据类型·注释·变量·常量·文件头
kaikaile199518 小时前
C# 文件编码转换工具
开发语言·c#
沐雪轻挽萤19 小时前
10. C++17新特性-保证的拷贝消除 (Guaranteed Copy Elision / RVO)
开发语言·c++
河阿里19 小时前
Java-JWT令牌技术深度指南
java·开发语言
文静小土豆19 小时前
Java 应用上 K8s 全指南:从部署到治理的生产级实践
java·开发语言·kubernetes
西西弗Sisyphus20 小时前
Python 在终端里彩色打印
开发语言·python·print·彩色打印