--每创建一个新类 就递增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
|
|
|
|
|