lua面向对象

lua中的table就是一种对象。
lua中可以通过修改元表元方法来实现面向对象。

self

table中的self相当于this

  • table与对象一样可以拥有状态
  • table也与对象一样拥有一个独立于其值的标识(一个self
  • table与对象一样具有独立于创建者和创建地的生命周期

lua只需使用冒号,则能隐藏self参数:

1
2
3
function Account:withdraw(dollar)
self.balance = self.balance - dollar
end

__index

一个类就像是一个创建对象的模具。我们可以利用__index元方法构造继承。
当访问一个table中不存在的字段时,得到的结果为nil。这是对的,但并非完全正确。实际上,这些访问会促使解释器去查找一个叫__index的元方法。如果没有这个元方法,那么访问结果如前述的为nil。否则,就由这个元方法来提供最终结果。

在lua中,将__index元方法用于继承很普遍,__index还可以是一个table。

1
2
3
4
5
6
function Account:new(obj)
obj = obj or {} --如果用户没有提供table继承,则创建一个
setmetatable(obj,self)
self.__index = self
return obj
end

self.__index = self做这个操作是因为self作为元表返回了,也就是查找的时候会进入table创建时的3个步骤。

lua类的实现

可以参考cocos2d-x自己给出的lua类的实现:
luaClass.lua

创建对象时,可以通过className.new这种方式来创建,如:

1
2
3
4
5
6
local MySpriteClass = class("MySpriteClass",cc.Sprite)

function MySpriteClass:ctor()
end

return MySpriteClass

mySpriteClass实例创建:

1
local mySprite = MySpriteClass.new(xxx.png)

1425134-20190408154553314-1254158238
classname.new()生成的instance包含一个class属性。class指向了类原型,并具有super,ctor,__cname__ctype4个属性。

继承C++的类,new方法使用__create函数来创建实例
继承lua类,new方法使用{ }来创建实例。


Cada uno es hijo de sus obras.