cocos2d-x 3.3 lua 版本的class函数用法:
local FightScene = class("FightScene", function()
return cc.Layer:create()
end)
可以发现“继承”的不是基类,而是基类的create函数
在这种情况下,FightScene创建对象的方式是:
local sceneObj = FightScene.new()
每个对象有一个“构造函数”ctor,在new的过程中调用,可以用来初始化成员
那么“继承”在这种情况下是怎样实现的呢?
原来new的时候,会先调用那个“继承”而来的函数,创建一个实例,再把FightScene的所有成员复制过去
下面是class函数的部分代码:
--Create an class.
function class(classname, super)
local superType = type(super)
local cls
if superType ~= "function" and superType ~= "table" then
superType = nil
super = nil
end
if superType == "function" or (super and super.__ctype == 1) then
-- inherited from native C++ Object
cls = {}
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
end
cls.ctor = function() end
cls.__cname = classname
cls.__ctype = 1
function cls.new(...)
-- 调用基类函数创建一个基类对象
local instance = cls.__create(...)
-- 增加本类的成员
for k,v in pairs(cls) do instance[k] = v end
instance.class = cls
-- 调用构造函数
instance:ctor(...)
return instance
end
else
-- inherited from Lua Object
if super then
cls = clone(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 cls
end
这样的定义有一个问题,就是类的“静态成员”会复制到每个对象中,虽然只是复制引用,但是也耗费了一些时间。