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