前置知识点
首先,lua并不是一个面向对象的语言,但是我们可以通过适当的方法来模拟出面向对象的效果。
在lua里,最像对象的我们可以马上联想到lua中的表。但是我们印象中的对象普遍都有属性和方法,但表里面好像只有属性啊。比如,
local obj = { a = "a", b = "b" }
没关系,上面我们也说了,需要使用适当的方法模拟。我们只需要改变一下思路,
local obj = {
a = "a",
b = "b",
print = function(msg1, msg2)
print(msg1..msg2)
end
}
obj.print("c", "d")
-- 输出 cd
这样一来,是不是就好像obj拥有了一个方法print
但其实lua给我们提供了一种更方便,功能更丰富的方法来给表提供方法
local obj = {
a = "a",
b = "b",
}
function obj:print()
print(self.a..self.b)
end
obj:print()
-- 输出 ab
我们可以用这种在方法名前加上对象名和冒号的方式将方法绑定到对象上,在调用方法的时候也是一样
需要注意的是,使用这种方法,会给我们带来一个极大的便利,就是上面示例中的self变量,这个self变量类似于java中的this关键字,指代调用该方法的对象实例,在本例中就是指代obj对象
定义类
上面我们虽然拥有了方法,但还没办法像传统对象一样,通过一个模板(即我们熟知的类),来创建许许多多拥有相同初始属性和方法的对象,所以现在我们就需要进一步模拟
local Person = { }
function Person:New(name, age)
local obj = {}
setmetatable(obj, self)
self.__index = self
obj.name = name
obj.age = age
return obj
end
function Person:Print()
print(self.name, self.age)
end
local p = Person:New("jack", 18)
p:Print()
上面我们给Person这个表添加了两个方法,New和Print。
其中New就类似我们熟知的构造方法,
我们先在New方法中定义了一个局部变量表obj,
并且将obj的元表(对元表以及后续一些lua中的概念不清楚的同学需要自行去菜鸟教程学习哈,本人比较懒,同时也不想引入太多与本文主题无关的概念,菜鸟地址:https://www.runoob.com/lua/lua-metatables.html )设置为self(这里的self指代Person表),
然后为元表设置元方法__index,对象为self,这样以后在obj上找不到的属性或者方法,就会再去Person表上找,
最后是常规的赋值,以及将obj作为返回值返回出去。
这样每次调用Person表的New方法就会得到一个拥有相同初始属性和方法的对象了。
也就相当于我们模拟了一个Person类