笨木头花心贡献,哈?花心?不,是用心~
转载请注明,原文地址: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]输出结果如下: