Lua自定义面向对象


local class={}
local _classInfoMap={} -- <class,classinfo> <classname,classinfo>
local _readonlyFields = {class=true,classname=true,super=true}
local function ExecuteCtor(cls,obj,...)
    if nil == obj then
        return
    end
    if cls.super then
        ExecuteCtor(cls.super,obj,...)
    end
    if cls.ctor then
        cls.ctor(obj,...)
    end
end

local function CreateClass(name,super)
    local class_type={ctor=false}
    local classinfo = {class=class_type,classname=name,super=super}
    _classInfoMap[class_type]=classinfo -- class,classinfo
    _classInfoMap[name]=classinfo -- classname,classinfo

    class_type.new = function(_,...)
        local obj={}
        setmetatable(obj,{__index=class_type
            ,__newindex=function(t,k,v)
            if _readonlyFields[k] then
                error(name .. "." .. k .. " is readonly")
            end
            rawset(t,k,v)
        end})
        ExecuteCtor(class_type,obj,...)
        return obj
    end
    setmetatable(class_type,{__index=classinfo,
        __newindex=function(t,k,v)
            classinfo[k]= v
        end
        })
    if super then
        setmetatable(classinfo,{__index=function(t,k) 
            local ret=_classInfoMap[super][k]
            classinfo[k]=ret 
            return ret
        end
        })
    end
    return class_type
end
setmetatable(class,{__call=function (_, ... )
    return CreateClass(...)
end})
function class.find(name)
    local classinfo  = _classInfoMap[name]
    return classinfo and classinfo.class or nil
end
return class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值