Lua类封装

通过元表指向父类,并且当获取字段的时候将字段Clone到当前元表中,下次获取字段就可以直接获取数据。云风的封装适用于有多层继承关系的情况,使用简单,性能和内存优化上都有较好解决。--作者:云风

云风的个人空间 : Lua 中实现面向对象

--[[
模拟继承结构的基类
]]
local _class = {}

function Class(super)
    local class_type = {}
    class_type.ctor = false            --构造函数
    class_type.super = super           --继承
    class_type.New = function(...)     --实例
        local obj = {}
        do
            local create               --创建闭包函数
            create = function(c, ...)
                if c.super then        --存在父类,递归创建
                    create(c.super, ...)
                end
                if c.ctor then
                    c.ctor(obj, ...)   --构造函数
                end
            end

            create(class_type, ...)    --闭包函数入口
        end

        setmetatable(obj, {__index = _class[class_type]})    --查找元表

        return obj
    end

    local vtbl = {}                      --临时表
    _class[class_type] = vtbl            --成员变量赋值

    setmetatable(                        --赋值、查找元表(vtbl查找与赋值)
        class_type,
        {
            __newindex = function(t, k, v)
                vtbl[k] = v
            end,
            --For call parent method
            __index = vtbl
        }
    )

    if super then                        --继承查找元表(vtbl赋值,返回父类值)
        setmetatable(
            vtbl,
            {
                __index = function(t, k)
                    local ret = _class[super][k]
                    vtbl[k] = ret
                    return ret
                end
            }
        )
    end

    return class_type
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值