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)
有点丑了样,封装一下super函数,看起来好看一点。。
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
原文链接:https://www.f2er.com/cocos2dx/339301.html