cocos2dx-lua class语法糖要注意了
发布时间:2020-12-14 17:10:35 所属栏目:百科 来源:网络整理
导读:cocos2dx-lua function.lua 定义了class方法,让lua实现继承像传统语言一样漂亮和方便 看定义 function class(classname,super) local superType = type (super) local cls -- 如果父类既不是函数也不是table则说明父类为空 if superType ~= " function " an
cocos2dx-lua function.lua 定义了class方法,让lua实现继承像传统语言一样漂亮和方便 看定义 function class(classname,super) local superType = type(super) local cls --如果父类既不是函数也不是table则说明父类为空 if superType ~= "function" and superType ~= tablethen superType = nil super = nil end 如果父类的类型是函数或者是C对象 if superType == or (super and super.__ctype == 1) then inherited from native C++ Object cls = {} 如果父类是表则复制成员并且设置这个类的继承信息 如果是函数类型则设置构造方法并且设置ctor函数 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 pairs(cls) do instance[k] = v end instance.class = cls instance:ctor(...) return instance else 如果是继承自普通的lua表,则设置一下原型,并且构造实例后也会调用ctor方法 inherited from Lua Object if super then cls = {} setmetatable(cls,{__index = super}) cls.super = super else cls = {ctor = end} end cls.__cname = classname cls.__ctype = 2 lua cls.__index = cls local instance = setmetatable({},cls) instance.class = cls instance:ctor(...) end return cls end 写个测试代码,注意出错的部分 local Base = class('Base')
Base.__index = Base
function Base:ctor(id)
print(Base:ctor',id)
self.id = id
end
local ExtBase = class(ExtBase ExtBase
function ExtBase:ctor(id)
Base:ctor(id)
super(self,id)
ExtBase:ctor 受传统语言影响,会在子类调用基类的构造函数,而事实上,这导致直接将类型本身作为对象实例传入
导致self指向是那个类型本身(也是个table) 那就只能这么写了 Base.ctor(self,id) function super(o,...) --if (o and o.super and o.super.ctor) then o.super.ctor(o,255); line-height:1.5!important">end end
上文来自:http://www.cnblogs.com/linbc/p/3871839.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |