Lua 实现继承的一种方式

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

lua 复制代码
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

调用方式

lua 复制代码
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

相关推荐
diediedei14 小时前
C++编译期正则表达式
开发语言·c++·算法
学海无涯书山有路14 小时前
Android FragmentContainerView 新手详解(Java 版)
android·java·开发语言
XiYang-DING15 小时前
【Java SE】数据类型、变量、类型转换、运算符以及程序逻辑控制
java·开发语言
独自破碎E16 小时前
JDK版本的区别
java·开发语言
谦宸、墨白16 小时前
从零开始学C++:二叉树进阶
开发语言·数据结构·c++
建群新人小猿16 小时前
陀螺匠企业助手—个人简历
android·大数据·开发语言·前端·数据库
千金裘换酒16 小时前
栈和队列定义及常用语法 LeetCode
java·开发语言
be or not to be17 小时前
JavaScript 对象与原型
开发语言·javascript·ecmascript
0x5317 小时前
JAVA|智能无人机平台(二)
java·开发语言·无人机
嵌入小生00717 小时前
基于Linux系统下的C语言程序错误及常见内存问题调试方法教程(嵌入式-Linux-C语言)
linux·c语言·开发语言·嵌入式·小白·内存管理调试·程序错误调试