首页 > 代码库 > cocos2dx-lua class语法糖要注意了
cocos2dx-lua class语法糖要注意了
cocos2dx-lua function.lua 定义了class方法,让lua实现继承像传统语言一样漂亮和方便
看定义
function class(classname, super) local superType = type(super) local cls --如果父类既不是函数也不是table则说明父类为空 if superType ~= "function" and superType ~= "table" then superType = nil super = nil end --如果父类的类型是函数或者是C对象 if superType == "function" or (super and super.__ctype == 1) then -- inherited from native C++ Object cls = {} --如果父类是表则复制成员并且设置这个类的继承信息 --如果是函数类型则设置构造方法并且设置ctor函数 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 cls.__create = super cls.ctor = function() end end --设置类型的名称 cls.__cname = classname cls.__ctype = 1 --定义该类型的创建实例的函数为基类的构造函数后复制到子类实例 --并且调用子数的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表,则设置一下原型,并且构造实例后也会调用ctor方法 -- inherited from Lua Object if super then cls = {} setmetatable(cls, {__index = super}) cls.super = super else cls = {ctor = function() end} end cls.__cname = classname cls.__ctype = 2 -- lua cls.__index = cls function cls.new(...) local instance = setmetatable({}, cls) instance.class = cls instance:ctor(...) return instance end end return clsend
写个测试代码,注意出错的部分
local Base = class(‘Base‘)Base.__index = Basefunction Base:ctor(id) print(‘Base:ctor‘,id) self.id = idendlocal ExtBase = class(‘ExtBase‘,Base)ExtBase.__index = ExtBasefunction ExtBase:ctor(id) --Base:ctor(id) super(self,id) print(‘ExtBase:ctor‘,id)end
受传统语言影响,会在子类调用基类的构造函数,而事实上,这导致直接将类型本身作为对象实例传入
导致self指向是那个类型本身(也是个table)
那就只能这么写了
Base.ctor(self,id)
有点丑了样,封装一下super函数,看起来好看一点。。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。