-- 使用lua自定义类 local _class = {} function BaseClass(super) -- 生成一个类类型, 实际上存放类信息 local class_type = {} -- 顶层父类"__delete"为false class_type.__delete = false -- 父类初始化 class_type.super = super -- 创建接口(类似与C++里面的构造函数) class_type.New = function(...) print(" >>>>>>>>>>> class_type.New") -- 生成一个类对象 local obj = {} -- 对象类型赋值 obj._class_type = class_type --[[在初始化之前注册基类方法(为了支持子类自定义函数,如"MyTestOutput") 当搜索对象时找不到子类自定义的方法,则搜索元表 "_class[class_type]",这里为"vtbl" --]] setmetatable(obj, { __index = _class[class_type] }) -- 注册一个delete方法(类似与C++里面的析构函数) obj.DeleteMe = function(obj_self) -- print(" >>>>>>>>>>>>>> obj.DeleteMe -- g_mylayer.DeleteMe") print(" >>>>>>>>>>>>>> obj:DeleteMe -- g_mylayer:DeleteMe") --[[ local now_super = obj_self._class_type while now_super ~= nil do if now_super.__delete then -- 和"__init"一样,子类需要定义函数体 now_super.__delete(obj_self) end now_super = now_super.super end --]] end --[[调用初始化方法(从最顶层父类到最底层子类, 依次调用定义的__init函数),采用可变参数 --]] class_type.__init(obj, ...) return obj end ------------------------------ local vtbl = {} _class[class_type] = vtbl --[[当搜索vtbl找不到时,vtbl的元表定义了搜索vtbl自身, 如果找不到则创建。 --]] setmetatable(class_type, {__newindex = function(t,k,v) vtbl[k] = v end , -- 没有父类的情况下,vtbl搜索自己 __index = vtbl, --For call parent method }) -- 有父类,vtbl搜索父类 if super then setmetatable(vtbl, {__index = -- 搜索函数,针对父类向上 一层层搜索 function(t,k) local ret = _class[super][k] return ret end }) end return class_type end ------------------------------------- -- 以下为测试上面的类创建函数 ------------------------------------- mylayer = mylayer or BaseClass() -- 初始化函数 function mylayer:__init() -- self 定义的变量为全局 self.my_self_test = 20 print(" >>>>>>>>>> mylayer:__init", self.my_self_test) -- 测试使用"self"调用函数 self:DeleteMe() end -- 删除函数 function mylayer:__delete() print(" >>>>>>>>>> mylayer:__delete") end -- 子类自定义函数 function mylayer:MyTestOutput() print(" >>>>>>>>>> mylayer:MyTestOutput") end ------------------------------------- --[[New创建对象,New函数在调用BaseClass创建类之后被定义 --]] g_mylayer = mylayer.New() --[[MyTestOutput没有在BaseClass中定义,是子类自定义函数。 ":"(冒号)是lua的一种语法糖。 --]] -- g_mylayer:MyTestOutput() -- 或者 g_mylayer.MyTestOutput() ------------------------------------- -- g_mylayer:DeleteMe() -- 或者 g_mylayer.DeleteMe()
时间: 2024-10-13 06:37:48