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 clsif superType ~= "function" and superType ~= "table" thensuperType = nilsuper = nilendif superType == "function" or (super and super.__ctype == 1) then-- inherited from native C++ Objectcls = {}if superType == "table" then-- copy fields from superfor k,v in pairs(super) do cls[k] = v endcls.__create = super.__createcls.super = superelsecls.__create = superendcls.ctor = function() endcls.__cname = classnamecls.__ctype = 1function cls.new(...)-- 调用基类函数创建一个基类对象local instance = cls.__create(...)-- 增加本类的成员for k,v in pairs(cls) do instance[k] = v endinstance.class = cls-- 调用构造函数instance:ctor(...)return instanceendelse-- inherited from Lua Objectif super thencls = clone(super)cls.super = superelsecls = {ctor = function() end}endcls.__cname = classnamecls.__ctype = 2 -- luacls.__index = clsfunction cls.new(...)local instance = setmetatable({}, cls)instance.class = clsinstance:ctor(...)return instanceendendreturn clsend
这样的定义有一个问题,就是类的“静态成员”会复制到每个对象中,虽然只是复制引用,但是也耗费了一些时间。