笨木头花心贡献,哈?花心?不,是用心~
转载请注明,原文地址:http://www.benmutou.com/archives/1800
文章来源:笨木头与游戏开发
[cce_lua] function search(classes, key) for i = 1, #classes do local value = classes[i][key]; if value ~= nil then return value; end end end这里的classes参数,是一个table,这个table里又存放了多个table,也就是我们想要继承的那些类。 而key就是要查找的字段。
local t1 = {name = "hehe"}; local t2 = {game = "who"}; print(search({t1, t2}, "game")); [/cce_lua]
[cce_lua]
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
[/cce_lua]
createClass函数就是用来创建一个继承了多个类的子类,有点小复杂,慢慢分析:[cce_lua]
    -- 一个精灵类
    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();
[/cce_lua]
这里创建了两个类:TSprite和TBullet。[cce_lua]
function createTSprite()
    local self = {name = "benmutou"};
    local function myBus()
        print("myBus是我自己的函数,你不能直接调用");
    end
    local function myGame()
        print("myGame是我自己的函数,你不能直接调用");
    end
    local function hello()
        print("hello:");
        myBus();
    end
    local function hi()
        print("hi:");
        myGame();
    end
    
    local function setName(newName)
        self.name = newName;
    end
    
    return {hello = hello, hi = hi, setName = setName};
end
[/cce_lua]
我们已经不需要用到冒号来定义函数了,这个类的name、myBus、myGame都是不希望给外部直接调用的。[cce_lua] local sp = createTSprite(); sp.hello(); sp.hi(); [/cce_lua]输出结果如下: