lua對於面向對象的支持主要經過table來實現,每一個table都是一個對象,對於繼承,lua有元表的機制,經過setmetatble()能夠來修改元表, #元表是什麼? 元表其實就是在自己找不到的東西,就會去元表中查找。 #__index元方法: __index方法是用來肯定一個表在被做爲元表時的查找方法。它的值能夠使函數也但是是table,通常用法爲:函數
<!-- lang: lua --> local obj = {} setmetatable(obj, {__index = xx}) --這樣便實現了obj實現繼承自xx。
對於多繼承,原理就是遍歷多個父類的,代碼以下:lua
<!-- lang: lua --> local class1 = {} function class1:new() local obj = {} setmetatable(obj, {__index= class1}) return obj end function class1:print1() print("class1:print()") end local class2 = {} function class2:new() local obj = {} setmetatable(obj, {__index= class2}) return obj end function class2:print2() print("class2:print()") end function super(k, list) for i,v in ipairs(list) do local ret = v[k] if ret then return ret end end end local class3 = {} function class3:new() local obj = {} local base = {class1, class2} --t爲調用的對象,k爲方法名 setmetatable(class3, {__index= function(t,k) return super(k, base) end}) setmetatable(obj, {__index = class3}) return obj end
結果輸出:code
class1:print()對象
class2:print()繼承