前文:https://blog.csdn.net/Jaihk662/article/details/95452907(Lua表与元表)
一、Lua的“面对对象”
可以看到题目和标题的“类与对象”都是加了引号的,原因很简单:
Lua语言本质上是非常简单的,没有强大的类库,所以说使用Lua独立开发一款程序是不可能的,大部分情况都是是嵌入到其他语言编写的程序中进行辅助工作,这句话的意思就是:其实Lua根本就没有类与对象的概念
而Lua所谓的“面对对象”其实是根据table模拟出来的一个环境,所以和一般语言的类与对象还是有差,那么究竟是怎么模拟的呢?可以参考下面这份最简单的代码:
print("--------------------------------------------------------------------")
t1 = {1,2,3}
t2 = {1,2,3}
t3 = t1
print(t2 == t1) --false
print(t3 == t1) --true
t3[3] = 5
print(t1[3]) --5,可以发现table是引用型的
print("--------------------------------------------------------------------")
Person = {name, age} --定义一个Person类,其中name和age都为“字段”,注意这里的name没有加双引号,所以当然不是字符串
function Person:New(name) --模拟构造函数
local obj = {} --初始化一个新表
setmetatable(obj, Person)
Person.__index = Person --设置元表并指定索引
obj.name = name
return obj
end
function Person:Show() --模拟一个方法
print(string.format("名字:%s, 年龄:%d", self.name, self.age))
--self表示当前"类"的对象,和C#中的this类似
end
you = Person:New("Huangkai")
you.age = 250
me = Person:New("Jia")
me.age = 10
you:Show()
me:Show()
print(Person)
print("--------------------------------------------------------------------")
可以从代码中得出:
- table本质是引用型
- 构造函数的实现利用了元表
- 方法=函数,字段=value
二、类的继承
例子如下:
Person = {name = "", age = 0}
--语法糖:计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用
--function Person:New(name, age) 定义函数的两种方法,和下面起到的效果完全一样,其中":"是一种语法糖,同等于调用方法的时候把self自己传进去
Person.New = function(self, name, age)
local obj = {
name = name,
age = age
}
setmetatable(obj, self)
self.__index = self
return obj
end
function Person:Show()
print(string.format("名字:%s, 年龄:%d", self.name, self.age))
--self表示当前"类"的对象,和C#中的this类似
end
--Humen为子类
Humen = Person:New() --可以不传参数,默认为nil
function Humen:New(name, age, sex) --重写父类构造函数
local obj = {
name = name,
age = age,
sex = sex
}
setmetatable(obj, self)
self.__index = self
return obj
end
function Humen:SonShow() --子类方法
print(string.format("名字:%s, 年龄:%d,性别:%s", self.name, self.age, self.sex))
--self表示当前"类"的对象,和C#中的this类似
end
you = Person:New("Huangkai", 250)
you:Show()
me = Humen:New("Jia", 15, "boy")
me:SonShow()
me:Show()