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
Lua自定义面向对象
最新推荐文章于 2023-07-05 16:35:43 发布