Lua点滴LuaLua脚本语言开发

(Lua中的类 - 3)在Lua中实现类的多继承

2017-02-21  本文已影响53人  qufl
--[[
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函数


上一篇下一篇

猜你喜欢

热点阅读