LuaForUnity7:Lua“類與對象”

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章