--[[
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函数
(Lua中的类 - 3)在Lua中实现类的多继承
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 学时间管理,过自律人生,你好,我是海长江,这里是时间管理干货铺,在这里分享学生的故事,领略自律的魅力,今天要分享我...