Lua之模拟继承关系

  由前面的内容可知,Lua中所谓的“类”是用表模拟出来的。在这里,我们将继续模拟其他语言之中的继承关系。Universe为父类,而Planet为子类,我们以此来创建“星球”对象。代码如下:

--模拟继承关系

Universe = {name}

Universe.age = 404

--构造方法
function Universe:New(name)
	local obj = {}
	setmetatable(obj, self)
	self.__index = self
	self.name = name
	return obj
end

--普通方法
function Universe:Creat()
	print("This star exists in " .. self.name)
end

--无参数时传递可以传递nil或者为空, 这里模拟使Universe为父类, Planet为子类
Planet = Universe:New(nil)

Planet.color = "blue"
Planet.number = 9999

--构造方法
function Planet:New(name)
	local obj = Universe:New(name)
	print("----------------构造方法中的obj------------------")
	printer(obj)
	print("----------------构造方法中的Planet----------------")
	printer(self)
	setmetatable(obj, self)
	self.__index = self
	return obj
end

--普通方法
function Planet:Beauty()
	print("What a Beautiful planet!")
end

star_1 = Planet:New("Beautiful universe")
star_1:Creat()
star_1:Beauty()

print("--------------星球一的表-------------")
printer(star_1)

star_2 = Planet:New("Dark universe")
star_2:Creat()
star_2:Beauty()

这里表与表之间的关系可能是个理解的难点,让我们先看一下输出的结果。



一开始Universe作为局部变量空表的元表,其__index索引指向自身。


Planet作为Universe实例化的“对象”,其表结构与上面有些不同:


可能相对来说最难以理解的便是Planet中实例化方法中表的关系,obj作为Universe实例化出的一个表,将Planet设置为其元表,结构会是如何呢?请看下图:


这便是Planet中New方法返回的表的结构,由图可知,这个“对象”既有“父类”Universe中的name, age属性, Creat,New方法,也有“子类”中的color, number属性,New,Beauty方法。其中把Planet的元表设置为Universe便是模拟继承的方法。

刚刚出去的时候,想起今天是月全食+超级月亮+蓝月亮。有多久没有对天象感兴趣了呢?还记得以前总是怀揣着希望去等待每一场流星雨,结果一颗流星都没有看到。直到一次外出学习,却与流星不期而遇。或许人生也是如此,努力活着,耐心等待,等待着与美好的不期而遇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值