1. 程式人生 > >Lua中多重繼承的簡單實現

Lua中多重繼承的簡單實現



--多個table表中尋找對應key的值
function search(classes, key)
    for i = 1, #classes do
        local value = classes[i][key];
        if value ~= nil then
            return value;
        end
    end
end
local t1 = {name = "hehe"};
local t2 = {game = "who"};
print(search({t1, t2}, "game"));




--用於建立繼承多類的子類
function createClass(...)
    local parents = {...};
    local child = {};
   
    -- 設定類的元表
    setmetatable(child, {
        __index = function(table, key)
            return search(parents, key);
        end
    })
   
    -- 給類新增一個new函式,用於建立物件
    function child:new()
        o = {};
        setmetatable(o, child);
        child.__index = child;
        return o;
    end
   
    -- 返回這個繼承了多個類的子類
    return child;
end
--上述測試用例
    -- 一個精靈類
    TSprite = {}
    function TSprite:hello()
        print("誰跟你hello!");
    end
   
    function TSprite:new()
        o = {}
        setmetatable(o, self);
        self.__index = self;
        return o;
    end
   
    -- 一個子彈類
    TBullet = {}
    function TBullet:fire()
        print("別動,再動我就瞄不準了!");
    end
    function TBullet:new()
        o = {}
        setmetatable(o, self);
        self.__index = self;
        return o;
    end
   
    -- 繼承了兩個類的子類
    local BulletSprite = createClass(TSprite, TBullet);
   
    -- 子類的物件
    local bSprite = BulletSprite:new();
    bSprite:hello();
    bSprite:fire()