1.Lua面向對象實現步驟
①創建一個全局表(稱之為元表)
②設置這個元表的__index值(值通常為元表自己,這樣就能通過__index查找到對應的屬性和方法)
__index 賦值其實是一個function的語法糖,Sharp.__index = Sharp等價於Sharp.__index = function(key) return Sharp[key] end
③新建一個表,使用setmetatable方法將元表設置到這個新表中,那這個新表就能以對象的方式來調用對應的屬性和方法了
當這個對象調用屬性或者函數時,首先查找自身的元表,如果找到則返回;如果沒找到,則檢查元表中是否有__index,如果有,則使用__index的值繼續查找,直到沒有__index為止。
其實這個過程和C++中的代碼流程是完全一致的(多了將對應方法設置到元表中的過程)具體可參看《Lua和C++交互 學習記錄之九:在Lua中以面向對象的方式使用C++注冊的類》
2.例子
①代碼
Sharp = { _val = 1} --① 父類
function Sharp:new() local new_sharp = { } self.__index = self --②,self == Sharp
setmetatable(new_sharp, self) --③
return new_sharp end
function Sharp:sharp_func() print("Sharp call sharp_func") end
function Sharp:name() print("Sharp call name") end
function Sharp:val() print(string.format("Sharp call val %d", self._val)) end
②調用代碼
local sharp = Sharp:new() sharp:sharp_func() sharp:name() sharp:val()
③輸出結果
Lua面向對象: