lua 继承,使用元方法__index

这篇博客介绍了Lua中如何利用table和元方法__index实现继承。在Lua中,table充当对象和类,所有成员存储在table内。通过__index,当尝试访问不存在的索引时,会查找并调用该元方法,从而实现继承行为。
摘要由CSDN通过智能技术生成

 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 的方法和属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值