前文: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()