由前面的内容可知,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便是模拟继承的方法。
刚刚出去的时候,想起今天是月全食+超级月亮+蓝月亮。有多久没有对天象感兴趣了呢?还记得以前总是怀揣着希望去等待每一场流星雨,结果一颗流星都没有看到。直到一次外出学习,却与流星不期而遇。或许人生也是如此,努力活着,耐心等待,等待着与美好的不期而遇。