--[[
3.使用metatable的__index来从多个table中查找key,实现多继承
原理:
在类的继承的基础上实现多继承,实际就是将metatable的__index设置为一个可以在多个table中查找key的函数即可。
如果有一个类A,想要集成类B和C,我们可以在类A中将B和C保存起来。
然后给A设置一个metatable,metatable的__index字段为一个函数,这个函数从类A保存的B和C中去查找需要的字段。
]]
-- 这里实现一个示例,Person、Woker、Coder分别是一个类,Coder集成自Person和Worker类
-- Person类
Person = {}
Person.__index = Person
Person.name = "Person"
Person.age = 0
function Person:new()
local obj = {}
setmetatable(obj, Person)
return obj
end
-- Worker类
Worker = {}
Worker.__index = Worker
Worker.dept = "Department"
Worker.level = 1
function Worker:new()
local obj = {}
setmetatable(obj, Worker)
return obj
end
function Worker:work()
print("I am working.")
end
-- Coder类
Coder = {}
Coder.__index = Coder
Coder.parents = {Person, Worker} -- 父类的列表
setmetatable(Coder, {__index = function(tab, key) -- 本类的metatable不是任何一个父类,__index是一个用于查找key的函数
for k,v in pairs(Coder.parents) do
if v[key] then
return v[key]
end
end
end})
Coder.proj = "slither"
function Coder:new()
local obj = {}
setmetatable(obj, Coder)
return obj
end
function Coder:work() -- 相当于重写Worker中的work方法,实际是Coder有了work方法之后就不会去到Worker中查找work方法了
print("I am coding.")
end
-- 新建一个Coder类的对象
local me = Coder:new()
print(me.name) -- Person中的name字段
print(me.age) -- Person中的age字段
print(me.dept) -- Worker中的dept字段
print(me.level) -- Worker中的level字段
print(me.proj) -- Coder中的proj字段
me:work() -- Coder中的work函数
网友评论