笨木头花心贡献,哈?花心?不,是用心~
转载请注明,原文地址: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; endcreateClass函数就是用来创建一个继承了多个类的子类,有点小复杂,慢慢分析:
[/cce_lua]
[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这里创建了两个类:TSprite和TBullet。
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]
[cce_lua] function createTSprite() local self = {name = "benmutou"};我们已经不需要用到冒号来定义函数了,这个类的name、myBus、myGame都是不希望给外部直接调用的。
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]
[cce_lua] local sp = createTSprite(); sp.hello(); sp.hi(); [/cce_lua]输出结果如下: