-- 星月相随倾心贡献~~~ -- cocos2d-x 3.0 + lua中,创建对象,用系统自带的,如下: -- example: print( "require test" ) local Test = class( "Test" ) Test.__index = Test function Test:ctor(...) print( "Test:ctor" ) end return Test -- 创建对象 local Test = require "Test" -- 这里会打印:require test -- 文件在require时,已经对外层变量进行了:初始化 local obj = Test:new() -- 这里会打印:Test:ctor -- class自带的方法new()会自动调用方法ctor(...),该方法也称为:构造函数 -- 如果要传递参数进入,可以在new(...)中传入,在构造函数中读取除了,各位自己可以去尝试,这里就不再叙述。 -- 作者这里觉得创建方法非常不好,比如我要通过标签的方式去方便其他人使用,例如: -- 这里只是示意代码,不注重代码质量 -- file:a g.Test = require "Test" -- file:b local obj = g.Test:new() -- file:c local obj = g.Test:new() -- 引入文件 require "a.lua" require "b.lua" require "c.lua" -- 看出其他人调用是非常方便的 -- 但是如果改成: -- 引入文件 require "b.lua" -- error: 找不到g.Test require "c.lua" -- error: 找不到g.Test require "a.lua" -- 需要用户自己注意引入的顺序 --- bug——1 -- 这个问题,就是文件require时,就已经初始化了变量。 -- 再看一个例子,例如: -- file:test中增加一个全局参数 g.t = 3 -- file:test2 local Test2 = class( "Test2" ) local m = g.t * 10 -- 使用test文件中的 ... return Test2 -- file:a g.Test2 = require "Test2" -- error: g.t是一个nil值 g.Test = require "Test" -- 可以看到,这个需要很仔细的了解每一个文件,顺序的初始化,文件少的话,还能理清顺序,但是文件多起来,就很难维护 ----- bug——2 -- 另外:一个项目不是一个人完成的,其他人不可能知道你需要的初始化顺序,这样就导致问题了 ---- bug——3 -- 还有一个问题就是:require一个文件,并创建了一个全局对象,但是对象的数据还没有创建。这时候其他文件中,在外层数据中使用全局对象数据,则会获得一个nil值。 ---- bug——4 -- example -- file: a a = class( "a" ) -- 全局 a.__index = a function a:set( t ) a.t = t end function a:get() return a.t end return a -- file: b local a = require "a" local m = a.get() * 10 return m -- require g.a = require "a" g.b = require "b" -- error: g.get() return a nil value -- 其他操作 a:set( 5 ) require "b" -- m = 50 -- 这时希望在a设置了值之后再创建b,而不是在一个文件中创建所有。但同时有需要方便其他人使用,这个怎么办呢??? -- 方法如下: -- file: type g.a = "a" g.b = "b" -- 定义创建对象函数: function createInst( a, ... ) local CLS = class( require "".. a ) -- 这个忘记了是:require "" .. a 还是 require tostring(a),读者自己试用一下咯~~~~汗~~!!! local cls = CLS:new() if cls and cls.init then cls:init( ... ) -- 调用对象初始化方法: 传递参数 end return cls -- 返回对象 end -- 创建对象 require "type" local obj = createInst( g.a ) obj:set( 5 ) local b = createInst( g.b ) -- 为什么不直接在 new 中传递参数??? -- 作者自己有自己的看法:也就是说作者会在ctor(...)中做一些基本的事情,把两个区分开来,只是为了更方便的管理~~!!!! -- 终于把这章写完,希望对各位有帮助~ -- lua我也是初学者,所以有些地方可能写的不好,或者有更好的方法去实现,希望各位能多多指教,多多指导,星月会努力改进!!! -- 感谢各位花时间阅读本人的作品,谢谢~~~祝各位都能大展宏图,万事顺利~~~下一章节见~~~~
作者使用 cocos2d-x 3.0 + lua学习和工作心得,未经作者允许,请勿转载!在此谢谢各位手下留情~~~
本文没有获得作者本人同意,不得转载,否则必追究相关责任。转载请注明出处!!~~