lua
中的table就是一种对象。lua
中可以通过修改元表元方法来实现面向对象。
self
table
中的self
相当于this
。
table
与对象一样可以拥有状态table
也与对象一样拥有一个独立于其值的标识(一个self
)table
与对象一样具有独立于创建者和创建地的生命周期
lua只需使用冒号,则能隐藏self参数:
1 | function Account:withdraw(dollar) |
__index
一个类就像是一个创建对象的模具。我们可以利用__index
元方法构造继承。
当访问一个table
中不存在的字段时,得到的结果为nil
。这是对的,但并非完全正确。实际上,这些访问会促使解释器去查找一个叫__index
的元方法。如果没有这个元方法,那么访问结果如前述的为nil
。否则,就由这个元方法来提供最终结果。
在lua中,将__index元方法用于继承很普遍,__index还可以是一个table。
1 | function Account:new(obj) |
self.__index = self做这个操作是因为self作为元表返回了,也就是查找的时候会进入table创建时的3个步骤。
lua类的实现
可以参考cocos2d-x自己给出的lua类的实现:
luaClass.lua
创建对象时,可以通过className.new
这种方式来创建,如:
1 | local MySpriteClass = class("MySpriteClass",cc.Sprite) |
mySpriteClass
实例创建:
1 | local mySprite = MySpriteClass.new(xxx.png) |
classname.new()
生成的instance
包含一个class
属性。class
指向了类原型,并具有super,ctor,__cname
和__ctype
4个属性。
继承
C++
的类,new
方法使用__create
函数来创建实例
继承lua
类,new
方法使用{ }
来创建实例。