溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Metatable與面向對象、繼承

發布時間:2020-06-30 16:27:16 來源:網絡 閱讀:425 作者:qq646827911 欄目:開發技術

Lua是個面向過程的語言, 但通過Metatable可以模擬出面向對象的樣子. 其關鍵就在于__index這個域. 他提供了表的索引值入口. 這很像重寫C#中的索引器, 當表要索引一個值時如table[key], Lua會首先在table本身中查找key的值, 如果沒有并且這個table存在一個帶有__index屬性的Metatable, 則Lua會按照__index所定義的函數邏輯查找. 仔細想想, 這不正為面向對象中的核心思想繼承, 提供了實現方式么. Lua中實現面向對象的方式非常多, 但無論哪種都離不開__index.


local bb = {cancry = true} 

function bb:new()
    b = {}
    self.__index  = self--改變自己的索引值入口
    setmetatable(b, self)--將b的索引值入口設成self,即(local bb = {cancry = true})
    return b
end

local ostrich = bb:new()
print(ostrich.cancry)



另外一個教程:


Person={}
  
 function Person:new(p)
     local obj = p
     if (obj == nil) then
         obj = {name="ChenHao", age=37, handsome=true}
     end
     self.__index = self--是怕self被擴展后改寫,所以,讓其保持原樣
     return setmetatable(obj, self)--返回第一個參數
 end
  
function Person:toString()
     return self.name .." : ".. self.age .." : ".. (self.handsome and "handsome" or "ugly")
 end


上面我們可以看到有一個new方法和一個toString的方法。其中:

1)self 就是 Person,Person:new(p),相當于Person.new(self, p)
2)new方法的self.__index = self 的意圖是怕self被擴展后改寫,所以,讓其保持原樣
3)setmetatable這個函數返回的是第一個參數的值。

于是:我們可以這樣調用:


me = Person:new()
 print(me:toString())
  
 kf = Person:new{name="King's fucking", age=70, handsome=false}
 print(kf:toString())



繼承:


Student = Person:new()
  
 function Student:new()
     newObj = {year = 2013}
     self.__index = self
     return setmetatable(newObj, self)
 end
  
 function Student:toString()
     return "Student : ".. self.year.." : " .. self.name
 end


student = Student:new()
print(student:toString())


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女