Lua不具有面向对象、继承等高级语言的属性,但是借助万能的table,仍然可以模拟实现面向对象继承的特性。
这里先要说明两个重要的概念:Metatable(元表)、__index(元方法)
Metatable(元表):是table预定义的一系列的操作,在进行各种table的操作时,若table本身没有,就会去它的元表中寻找。
__index(元方法):元方法是定义该表作为元表(是自身或别的表的元表)时的查找方法。因此,可以通过改变__index元方法,来改变检索之后的结果。
单继承:
只要为子类对象设置metatable,并令其_index成员指向父类即可。
如:
local Base = {}
local Derived = {}
funciton Derived:new()
local obj = {}
setmetatable(obj, {__index = Base})
return obj
end
多继承:
多继承与单继承类似,只不过不是让__index指向一个父类原型,而是令其指向一个搜索的函数,该函数遍历访问子类原型对象多继承的所有父类元原型。
如:
local Base1 = {}
function Base1:new()
local obj = {}
setmatatable(obj,{__index = Base1})
return obj
end
local Base2 = {}
function Base2:new()
local obj = {}
setmatatable(obj,{__index = Base2})
return obj
end
function super(k,list)
for k,j in ipairs(list) do
local ret = j[k]
if ret then
return ret
end
end
end
local Derived = {}
function Derived:new()
local obj = {}
local base = {Base1, Base2}
setmetatable(Derived, {__index = function(t, k)
return super(k, base)
end}
setmatatable(obj,{__index = Derived})
return obj
end