lua中table 可以作为对象,一个类,一个对象是一个table,对象中所有的变量和函数都存放在table中。实际上lua库中的方法也存在table中(print、tostring、tonumber等都存在_G这个全局的table中)。上篇文章中提到的__index的使用,当访问一个table 不存在的索引时,lua解释器回去查找这个table是否存在__index这个元方法,如果找到就调用__index 并返回最终的结果。利用这一特性,可以用来实现继承。
继承:简单的说就是一个类可以使用另个类的方法和属性的行为。例子如下
<span style="color:#33cc00;">--定义一个Account 类,属性balance 值100
--冒号和点号的区别参照其他文章,
--Account:new(a) 等价于 Account.new(self,a)</span>
Account = {balance = 100}
function Account:new(a)
a = a or {}
<span style="color:#33cc00;">--将类自身作为派生类的元表,也是自身的元表
--设置元方法__index,当访问a中不存在的索引的,lua解释器查找元方法,调用__index</span>
setmetatable(a,self)
self.__index = self
return a
end
function Account:pay()
print("pay money")
end
function Account:getBalance()
return self.balance
end
a = Account:new()
a:pay() <span style="color:#33cc00;"> ---输出:pay money</span>
print(a:getBalance()) <span style="color:#33cc00;">--输出100></span>
当调用Account:new() 就相当于派生了一个派生类a,访问a:pay() 时,table a的索引中并没有pay字段,lua解释器就会查找a的元方法__index, self.__index = self 这行代码将元方法__index 设置成Account,所以调用a:pay(),也就是调用Account:pay(),也就是实现的继承的机制,对象a可以直接使用对象Account 的方法和属性