首页 > 代码库 > lua创建自定义的类

lua创建自定义的类

 

 

 

 

 

-- 使用lua自定义类local _class = {}function BaseClass(super)-- 生成一个类类型,    实际上存放类信息local class_type = {}-- 顶层父类"__delete"为falseclass_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)endnow_super = now_super.superend--]]end--[[调用初始化方法(从最顶层父类到最底层子类,依次调用定义的__init函数),采用可变参数--]]class_type.__init(obj, ...)return objend------------------------------local vtbl = {}_class[class_type] = vtbl--[[当搜索vtbl找不到时,vtbl的元表定义了搜索vtbl自身,如果找不到则创建。--]]setmetatable(class_type, {__newindex =function(t,k,v)vtbl[k] = vend, -- 没有父类的情况下,vtbl搜索自己__index = vtbl, --For call parent method})-- 有父类,vtbl搜索父类if super thensetmetatable(vtbl, {__index =-- 搜索函数,针对父类向上 一层层搜索function(t,k)local ret = _class[super][k]return retend})endreturn class_typeend--------------------------------------- 以下为测试上面的类创建函数-------------------------------------mylayer = mylayer or BaseClass()-- 初始化函数function mylayer:__init()-- self 定义的变量为全局self.my_self_test = 20print(" >>>>>>>>>> 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() 

 

lua创建自定义的类