码迷,mamicode.com
首页 > 其他好文 > 详细

lua创建自定义的类

时间:2015-01-14 21:24:33      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

 

 

 

 

 

-- 使用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()

 

 

lua创建自定义的类

标签:

原文地址:http://www.cnblogs.com/yyxt/p/4224784.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!