当前位置: 首页 > news >正文

Lua 类管理器

Lua 类管理器

-- ***** Class Manager 类管理*****‘local ClassManager = {}local this = ClassManagerfunction 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' thenassert(cls.__create == nil, string.format("class() - create class \"%s\" with more than one creating function",className))cls.__create = superelseif superType == 'table' thenif super['.isclass'] thenassert(cls.__create == nil,string.format("class() - create class \"%s\" with more than one creating function or native class",className));cls.__create = function() super:create() endelse-- 用来保存父类cls.__supers = cls.__supers or {}local dp = falsefor _, v in pairs(cls.__supers) doif v.__className == super.__className thendp = truebreakendend-- set first super pure lua class as class.superif not dp then-- 将父类中所有的对象(变量或者函数)拷贝到子类中cls.__supers[#cls.__supers + 1] = superif not cls.super thencls.super = superendendendelseerror(string.format("class() - create class \"%s\" with invalid super type",className), 0)endendcls.__index = clsif not cls.__supers or #cls.__supers == 1 thensetmetatable(cls, {__index = cls.super})else-- 设置cls的元表为supers中的父类setmetatable(cls, {__index = function(_, key)local supers = cls.__supersfor i=1, #supers dolocal super = supers[i]if super[key] then return super[key] endendend})end-- 添加默认构造函数if not cls.constructor thencls.constructor = function() endend-- new 方法构建类对象cls.new = function(...)-- 构建一个对象local instanceif cls.__create theninstance = cls.__create(...)elseinstance = {}end-- 设置对象的元表为当前类setmetatable(instance, cls)instance.class = clsinstance:constructor(...)return instanceendcls.create = function(_, ...)return cls.new(...)end-- 返回类return clsendlocal setmetatableindex = function(t, index)local mt = getmetatable(t)mt = mt or {}if not mt.__index thenmt.__index = indexsetmetatable(t, mt)elseif mt.__index ~= index thensetmetatableindex(mt, index)end
endreturn ClassManager

使用

local MyObject = require('MyObject')
local ClassManager = require('ClassManager')
local obj3 = ClassManager.Class('obj3', MyObject)
--print(obj3)
obj3:myFunc()
obj3:myFunc2()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ChatTTS(文本转语音) 一键本地安装爆火语音模型
  • 微信公众号获取用户openid(PHP版,snsapi_base模式)
  • 【vluhub】zabbix漏洞
  • Minos 多主机分布式 docker-compose 集群部署
  • C语言玩一下标准输出——颜色、闪烁、加粗、下划线属性
  • Flink SQL 的工作机制
  • C++学习笔记——模板
  • UNIX 域协议
  • 从零到一使用 Ollama、Dify 和 Docker 构建 Llama 3.1 模型服务
  • 【Golang 面试 - 基础题】每日 5 题(十)
  • AIGC-VDM -Video Diffusion Models论文解读
  • CeoMax总裁主题最新3.8.1破解免授权版/WordPress付费资源素材下载主题
  • PHP完整表单实例
  • 爬虫学习——20.Scrapy框架(2)入门
  • 【开发学习笔记】git的工作区与分支
  • flutter的key在widget list的作用以及必要性
  • go append函数以及写入
  • gulp 教程
  • React+TypeScript入门
  • Redis 中的布隆过滤器
  • redis学习笔记(三):列表、集合、有序集合
  • SQLServer之索引简介
  • 分享一份非常强势的Android面试题
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 老板让我十分钟上手nx-admin
  • 聊一聊前端的监控
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端技术周刊 2019-02-11 Serverless
  • 物联网链路协议
  • 详解移动APP与web APP的区别
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 在Mac OS X上安装 Ruby运行环境
  • 智能合约Solidity教程-事件和日志(一)
  • No resource identifier found for attribute,RxJava之zip操作符
  • 2017年360最后一道编程题
  • AI算硅基生命吗,为什么?
  • 组复制官方翻译九、Group Replication Technical Details
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (ZT)一个美国文科博士的YardLife
  • (zt)最盛行的警世狂言(爆笑)
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (图)IntelliTrace Tools 跟踪云端程序
  • ******之网络***——物理***
  • .NET : 在VS2008中计算代码度量值
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET开发者必备的11款免费工具
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net中ListT 泛型转成DataTable、DataSet
  • /etc/fstab 只读无法修改的解决办法
  • @Documented注解的作用
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [120_移动开发Android]008_android开发之Pull操作xml文件