lua面向对象-----继承的实现

前言

在lua里是没有类的概念的,但是可以利用表(table)和元表特性来实现面向对象和继承。lua的表类似于一个对象,每个对象都有自己的方法和属性。当访问一个表中不存在的属性时,系统不会直接返回错误,而是访问该表的元表中的 __index 元方法。 __index 元方法既可以是一个方法,也可以是一张表,当 __index 为表时,从 __index 指示的表中查询不存在的属性,当 __index 为方法时,访问不存在的属性会触发调用此方法。


示例

利用这一特性,继承可以如下来实现:

local base = {x=10,y=20,z=100}

function base:new(o)
	o = o or {}
	self.__index = self
	setmetatable(o,self)
	return o
end

function base:show()
	print("base: " .. self.x .. " " .. self.y)
end

上例代码中 base 为"基类",方法 new 完成的功能是以调用者为"基类",以 o 为初始表,创建一个新对象,共有两个参数(方法名中使用":“是lua的一种语法,默认第一个参数为调用者自身),一个为调用者自身,即 “self”(类似于c++中的this指针),另一个参数 o 为初始表。
self.__index = self将调用者的 __index 元方法设置为调用者自身;setmetatable(o,self)o 的元表设置为调用者,如此在返回的新对象(即 o)中访问不存在的属性就会触发在"基类”(即 base)中查找;
接上,继承示例如下:

local test = base:new({z=0,f=99})

-- test中不存在,base中存在
print(test.x)	-- ====>> 10
print(test.y)	-- ====>> 20
test:show()		-- ====>> base: 10 20

-- test中不存在,base中不存在
print(test.a)	-- ====>> nil

-- test中存在,base中也存在(会被覆盖)
print(test.z)	-- ====>> 0

上例中 test 继承自 base,访问 test 中没有的属性,会到 base 中继续查找。继续来看下面的例子。

local temp = test:new({})
-- temp中不存在,base中存在
print(temp.x)	-- ====>> 10

-- temp中不存在,test中存在
print(temp.z)	-- ====>> 0
print(temp.f)	-- ====>> 99

上例中 temp 是从 test 中继承而来的,test 又是从 base 继承来的,所以 temp 可以访问到 testbase 中的所有属性,需要注意的是"父类"中同名的属性或方法会被"子类"覆盖。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值