--每创建一个新类 就递增1 保存每个类创建的顺序id _in_ctype_count = _in_ctype_count or 0 --通过类的创建顺序id来保存每一个类 _in_ctype_map = _in_ctype_map or {} --每创建一个新的对象 就递增1 在New中调用 保存每个对象创建的顺序id _in_obj_ins_id = _in_obj_ins_id or 0 --保存每个类对应实例化的n个对象 _in_obj_ins_map = _in_obj_ins_map or {} --保存每个类实例化对象的总个数 _in_obj_count_map = _in_obj_count_map or {} --保存每个类作为不一样类的父类的个数 _be_super_count_map = _be_super_count_map or {} local _in_ctype_count = _in_ctype_count local _in_ctype_map = _in_ctype_map local _in_obj_ins_map = _in_obj_ins_map local _in_obj_count_map = _in_obj_count_map local _be_super_count_map = _be_super_count_map local setmetatable = setmetatable local debug_getinfo = debug.getinfo --先调用基类的init函数,依次往上层次调用派生类 local function createFunc(class, obj, ...) if class.super then createFunc(class.super, obj, ...) end if class.__init then class.__init(obj, ...) end end --先调用本身的deleteme函数,再依次往下调用基类的 local function deleteMeFunc(self) if self._use_delete_method then return end self._use_delete_method = true local now_super = self._class_type while now_super ~= nil do if now_super.__delete then now_super.__delete(self) end now_super = now_super.super end --清理该类所有的资源引用计数 lua_resM:clearReference(self) end function BaseClass(super, use_class_type) local class_type = { __init = false, __delete = false, New = false, _source = false, __index = false, super = false, } _in_ctype_count = _in_ctype_count + 1 _in_ctype_map[_in_ctype_count] = class_type local cls_obj_ins_map = {} _in_obj_ins_map[class_type] = cls_obj_ins_map setmetatable(cls_obj_ins_map, {__mode = "v"}) _in_obj_count_map[class_type] = 0 local info = debug_getinfo(2, "Sl") class_type._source = info.source class_type.super = super if _in_ctype_count == 1 then --设置为弱引用 只需设置一次 setmetatable(_in_ctype_map, {__mode = "v"}) setmetatable(_in_obj_ins_map, {__mode = "k"}) setmetatable(_in_obj_count_map, {__mode = "k"}) setmetatable(_be_super_count_map, {__mode = "k"}) end if super then --如果有引用父类 则该对象递增1 if _be_super_count_map[super] == nil then _be_super_count_map[super] = 0 end _be_super_count_map[super] = _be_super_count_map[super] + 1 end class_type.New = function(...) local obj = nil if not use_class_type then _in_obj_ins_id = _in_obj_ins_id + 1 if class_type.__defineVar then --一次性生成该对象所要的属性 减少消耗 obj = class_type:__defineVar() else obj = { _class_type = class_type, _iid = _in_obj_ins_id, DeleteMe = nil, _use_delete_method = false } end local function newFunc(t, k) local ret = class_type[k] obj[k] = ret return ret end setmetatable(obj, {__index = newFunc}) else obj = class_type obj._class_type = class_type end cls_obj_ins_map[_in_obj_ins_id] = obj --save here for mem debug _in_obj_count_map[class_type] = _in_obj_count_map[class_type] + 1 createFunc(class_type, obj, ...) obj.DeleteMe = deleteMeFunc return obj end --如果该类中没有的方法 则通过元表来调用父类的该方法 if super then local function superFunc(t, k) local ret = super[k] class_type[k] = ret return ret end setmetatable(class_type, {__index = superFunc }) end return class_type end