在quick-cocos2dx里, 通过class() 函数进行类的定义
下面贴出quick-cocos2d-x-2.2.1-rc 里 class()的源码
我们先考虑最简单的情况, 在没有继承的情况下定义一个类ClassA
第一部分:LUA的继承充电站:元表
t = {}
print(getmetatablet)) --nil
mt {name = "quick"}
setmetatable, mt)
assertgetmetatalbe) == )
图示代码: --====================Person======================
local Person {}
Person.attack = 5
function :new(o)
o = o or {}
setmetatableself__index self
return o
end
:setAttackattackattack
getAttack()
end
HeroHero ()
Heroname = ""
skill ""
hero1hero2hero1 "金刚狼"
"甩开爪子切牛排"
hero2 ({"超人"})
hero2"内裤外穿走T台"
----====================================================
printKeysnametprint("======================" .. )
for kv in pairs) do
end
end
"Person")
"Person.__index"__index)
"Hero""Hero.__index""getmetatable(Hero).__index"getmetatable)."hero1""hero2" 结合log我们分析下:
这种情况下, ClassA 跟InstanceA的关系如下图
InstanceA的metatable为ClassA,而且ClassA.__index = ClassA,因此,对于InstanceA找不到的属性, 将在ClassA里进行查找。 需要注意的是,ClassA里的属性比如field1,是相当于类变量的概念,所有实例都公用该属性,并非各自维护该字段的拷贝。 下面如果要再定义ClassB,从ClassA 进行继承 --ClassB.lua
local ClassB "ClassB",))
?
return ClassB
这种情况下, ClassB 跟InstanceB,ClassA的关系如下图 同理,InstanceB里没有定义的属性, 将首先在ClassB里进行搜索, 如果ClassB里搜不到, 将向上追寻到ClassA里。 上面考虑的都只是针对纯Lua类, 在实际情况中, 我们需要对C++里生成的对象(userdata)进行扩展, 可以如下定义 --ClassC.lua
local ClassC "ClassC",102)">)
--调用C++接口创建一个原生对象(userdata),并且给该对象绑定一个peer(table),这里我们以创建一个CCNode为例
local node = CCNode:create) --原生对象(userdata)
local peer }
tolua.setpeer(node,peer )
return node
return ClassC
ClassC跟InstanceC的关系如下图
在调用InstanceC(实际上是一个userdata)上的某个方法时, 首先会先去这个userdata绑定的peer这个table里寻找这个方法,如果找不到才会去c++那层调用。 所以我们可以通过给peer添加几个方法从而实现给InstanceC(userdata)扩展方法, 实际情况上也确实如此,在quick里,有几个专门的类,CCNodeExtend,CCLayerExtend,CCSceneExtend,CCSpriteExtend, 使用比如 CCNodeExtend.extend(someCCNodeInstance),可以生成一个特殊的peer, 这个peer的metatable为CCNodeExtend, 这样我们就可以在someCCNodeInstance上调用CCNodeExtend定义了而原本CCNode没有的方法, 从而实现扩展。 下面再考虑ClassD从ClassC继承的情况 --ClassD.lua
local ClassD "ClassD",0)">"ClassC")
?
?
return ClassD
关系图:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |