溫馨提示×

溫馨提示×

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

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

Metatable與面向?qū)ο?、繼承

發(fā)布時間:2020-06-30 16:27:16 來源:網(wǎng)絡(luò) 閱讀:378 作者:qq646827911 欄目:開發(fā)技術(shù)

Lua是個面向過程的語言, 但通過Metatable可以模擬出面向?qū)ο蟮臉幼? 其關(guān)鍵就在于__index這個域. 他提供了表的索引值入口. 這很像重寫C#中的索引器, 當(dāng)表要索引一個值時如table[key], Lua會首先在table本身中查找key的值, 如果沒有并且這個table存在一個帶有__index屬性的Metatable, 則Lua會按照__index所定義的函數(shù)邏輯查找. 仔細(xì)想想, 這不正為面向?qū)ο笾械暮诵乃枷肜^承, 提供了實現(xiàn)方式么. Lua中實現(xiàn)面向?qū)ο蟮姆绞椒浅6? 但無論哪種都離不開__index.


local bb = {cancry = true} 

function bb:new()
    b = {}
    self.__index  = self--改變自己的索引值入口
    setmetatable(b, self)--將b的索引值入口設(shè)成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)--返回第一個參數(shù)
 end
  
function Person:toString()
     return self.name .." : ".. self.age .." : ".. (self.handsome and "handsome" or "ugly")
 end


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

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

于是:我們可以這樣調(diào)用:


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問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI