在lua中要实现对类的定义一般都是通过Metatable来做到的。。例如:
FJs = {}function FJs:new(name) local out = {} setMetatable(out,self) self.__index = self out.name = name return outendfunction FJs:sayHello() print("my name is " .. self.name) print("hello")endlocal fJs = FJs:new("fJs")fJs:sayHello()
首先定义了一个table,然后在它上面定义相应的方法,在创建对象的时候,通过将对象的Metatable指定为刚刚定义的table,这样也就实现了方法的绑定。。也就实现了类的定义和对象的创建。
上述实现中,自己需要定义一些约定的代码,在cocos2d-x中,为了实现的方便,扩展了一个class方法用于实现定义类型,对于上述类型的定义可以简化为如下:
FJs = class("FJs")function FJs:ctor(name) self.name = nameendfunction FJs:sayHello() print("I am " .. self.name) print("hello")endfJs = FJs.new("fJs")fJs:sayHello()
这个样子看起来简洁多了。。。这里定义了一个ctor方法,这个是构造函数
为了理解class究竟是怎么定义的。。来看看该方法的代码:
function class(classname,super) local superType = type(super) local cls --如果提供的super既不是函数,也不是table,那么就直接将super当做不存在 if superType ~= "function" and superType ~= "table" then superType = nil super = nil end --如果有提供super if superType == "function" or (super and super.__ctype == 1) then -- 定义一个table,它将作为类的定义 cls = {} --如果super是table,那么将super中定义的字段先全部拷贝到cls中 --然后将__create方法指定为super的__create方法 if superType == "table" then -- copy fIElds from super for k,v in pairs(super) do cls[k] = v end cls.__create = super.__create cls.super = super else --这里提供的super时函数,那么也就是用这个方法来构造对象,那么直接将__create方法指向super cls.__create = super end --提供一个空的ctor构造函数 cls.ctor = function() end cls.__cname = classname cls.__ctype = 1 --定义.new(...)方法,他用户构建对象,首先是调用__create方法来构建一个table对象,然后将cls里面定义的字段全部拷贝到创建的对象中 --接下来在调用ctor构造方法 function cls.new(...) local instance = cls.__create(...) -- copy fIElds from class to native object for k,v in pairs(cls) do instance[k] = v end instance.class = cls instance:ctor(...) return instance end else --从lua的类型中继承 if super then cls = clone(super) cls.super = super else --直接就没有super,那么定义cls为一个带有空ctor的table cls = {ctor = function() end} end cls.__cname = classname cls.__ctype = 2 -- lua cls.__index = cls --这里的new方法,首先是创建了空的table,然后将其Metatable指向为cls --然后在调用ctor构造方法 function cls.new(...) local instance = setMetatable({},cls) instance.class = cls instance:ctor(...) return instance end end --返回类型的定义 return clsend
注释已经说的很明白了吧,我们接下来来分析一段常用的使用方式:
GameScene = class("GameScene",function() return cc.Scene:create()end)function GameScene:ctor()endfunction GameScene:create() return GameScene.new()end
这是比较常用的自定义Scene的方法,提供了create方法来具体的构建GameScene对象。。
通过上述class的代码,我们可以知道如下的执行步骤:
(1)首先用class中定义的super函数来构建了一个对象,也就是Scene:create()之后得到的scene对象
(2)在该对象上调用定义的ctor方法
至于别的类型的定义,通过class代码的分析也能很容易的知道执行步骤
总结以上是内存溢出为你收集整理的cocos2d-x lua中class的定义全部内容,希望文章能够帮你解决cocos2d-x lua中class的定义所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)