lua创建自定义的类

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

lua创建自定义的类的相关文章

Lua调用自定义C++类

弄了一天终于会Lua调用自定义C++类.不容易啊. 我的电脑是64位的,装了64的Python不行,装了32位的就可以了,靠!下面是报错信息 python pyyaml Cheetah全都是装32位的,其中python版本是用2.7.8,是可以的. Cocos2d-x v3.2 Cocos Code IDE 1.2.0 NDK r9d dos2unix,windows下可能在执行脚本时有这个错误.是创建项目时没有了这个文件,可以去cocos2dx里面复制一个,如 E:\cocos2d-x-3.2

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践 -- 转

原地址: http://blog.segmentfault.com/hongliang/1190000000631630 Cocos2d-x下Lua调用自定义C++类和函数的最佳实践 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以

cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践

第一层:纯C环境下,把C函数注册进Lua环境 a.lua 文件 print(foo(99)) a.c 文件 #include <lua.h> #include <lualib.h> #include <lauxlib.h> int foo(lua_State *L) { int n = lua_tonumber(L, 1); lua_pushnumber(L, n + 1); return 1; } int main() { lua_State *L = lua_ope

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

原文地址:http://segmentfault.com/a/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质2.在cocos2d-x项目里,把纯C函数注册进Lua环境,理解cocos

【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 2.在cocos2d-x项目里,把纯C函数注册进L

CC3.2+Lua(8) ——Lua调用自定义C++类

[唠叨] 本节要讲的是如果将自己写的C++类注册进Lua环境,让Lua去调用自定义的C++类. 网上有很多都是用原始的tolua++工具来注册C++类的,我看了很多这样的教程,感觉操作起来十分麻烦,而且也很难看懂他们到底在讲什么. 其实,在cocos2dx v3.2版本中,提供了bindings-generator脚本来封装toLua++的用法,从而节省了工作量. [致谢] http://segmentfault.com/blog/hongliang/1190000000718145 (讲得非常

dojo框架之创建自定义的类

我们在dojo同级目录中创建一个文件夹itfanr,itfanr中新建一个文件person.js : define([ "dojo/_base/declare"], function (declare) {     return declare("itfanr.person", null, {         name: "zhangsan",         constructor: function (name) {             

自定义实体类在三层架构之间传递数据

自定义实体类是专门承载业务实体数据的类,一般将方法分离出来,只包含属性和字段的定义.每个实体类对应数据库中的一个表,每个属性对应表中的一个相应的字段.使用实体类属于面向对象编程的思想,将每个表封装成对应的类. 1. 为什么使用自定义实体类 (1)使程序更加灵活.如果数据库发生了更改,只需要修改数据实体类的代码,其他层的代码修改量很小. (2)使用面向对象思想将数据库中的表抽象为类,消除了关系数据与类的差别,使程序维护和扩展更方便. (3)更有利于分层架构设计. 2. 使用自定义实体类作为三层架构

【Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之四】使用绑定C++至Lua的自定义类

续[Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之三]动手绑定自定义类至Lua 之后,我们已经完成了自定义类至Lua的绑定.在接下来的环节,我们将使用它. 首先,我们需要确定,通过Python脚本我们生成了哪些绑定文件?我们罗列一个表单. // Path : F:\Cocos2dx-Lua\Garfield\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto 1. lua_pet_auto.hpp // Path :