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

Lua 实现继承的一种方式

以下代码来自Loxodon Framework,截取自其中的一段

function class(classname, super)
    local cls = {}
    cls.__classname = classname
    cls.__class = cls

    cls.base = function (self)
        return cls.super
    end

    cls.__type = 0
    cls.super = super
    cls.__index = cls

    if super then
        setmetatable(cls,{__index = super, __call = function (t,...)
            local instance = setmetatable({},t)  
            instance:ctor(...)
            return instance
        end})
    else
        cls.ctor = function (...)
            
        end

        setmetatable(cls,{__call = function (t,...)
            local instance = setmetatable({},t)
            instance:ctor(...)
            return instance
        end})
    end

    if not cls.ctor then
        cls.ctor = function (...)   --构造函数
            
        end
    end

    return cls
end

调用方式

local t = {1,2,3}
t.age = 10

local a = class("a",t)
print(a.age)  --输出10

local b = a()   --调用了__call元方法,相当于是构造函数
print(b.age)  --输出10

当调用a.age时,a相当于cls,会从__index中寻找age,即super,也就是t中寻找
而当通过local b = a() 的方式调用时,会进入到__call元方法中,instance 会从cls继承,相当于把cls设置为了instance的元表,最终返回instance


http://www.kler.cn/a/406173.html

相关文章:

  • 空间数据存储格式GeoJSON
  • 【ChatGPT】如何设计问题让ChatGPT生成创意写作内容
  • Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
  • 『 Linux 』文件与网络套接字的内部关系
  • 系统性能优化方法论详解:从理解系统到验证迭代
  • 在 TiDB 中修改数据库密码的步骤与 MySQL 类似。
  • n、nvm、nrm、pnpm、yarn各种指令大全
  • 设计模式之 责任链模式
  • .net 7.0 解决“The keyword field is required”的问题
  • 面向服务的软件工程——巨详细讲解商务流程建模符号 (BPMN),一篇章带你入门BPMN!!!(week1)
  • 在win10环境部署opengauss数据库(包含各种可能遇到的问题解决)
  • 基于RTEMS项目学习waf build system
  • 「漏洞复现」ArcGIS 地理信息系统 任意文件读取漏洞
  • pycharm在使用conda虚拟环境时Terminal爆红问题
  • 2.STM32之通信接口《精讲》之IIC通信---软件实现IIC《深入浅出》面试必备!
  • Javaee文件的io操作
  • 使用 PyTorch 实现并训练 VGGNet 用于 MNIST 分类
  • Frida反调试对抗系列(二)
  • pcb元器件选型与焊接测试时的一些个人经验
  • SELinux知识点
  • C++学习第四天
  • 深入了解 Spring Security 的授权核心功能
  • idea 程序打包 jar 发布
  • 前端 vue 如何区分开发环境
  • 使用php和Xunsearch提升音乐网站的歌曲搜索效果
  • vue 目录结构