天天看点

lua 多继承实现

         从事cocos2d-x 游戏开发,现离职状态。没事写写代码。喜欢使用quick开发游戏,理由嘛,一个字,爽啊。最近认真细读quick框架里面的代码,发现function里面只有一个class函数,而且,这个函数既然只支持单继承功能!!!这能忍?

多手多脚的我只好自己想了一下,搞了一个多继承出来。哈哈

----多继承----必须是继承自同一个机制,否则可能会有问题

--- ... 为父类

function classmultiple(classname , ...)

local child = {}

local parents = {...} ---父类集合

child.__cname = classname

---search 函数应该改为深度搜索,现在是2维表遍历

-- local function search( classtl , key ) ----根据key在二维表(多个类)当中查找字段

-- for i=1,#classtl do

-- local var = classtl[i][key] ;

-- if var then

-- return var;

-- end

-- end

-- print("not found father function of value!");

-- end

------深度遍历一个值----

---深度遍历一个值----

local function search(object , KEY ) ---key为查找字段

local search_value; ---寻找的变量

local search_key;

local function _copy(object)

if type(object) ~= "table" then ---object 不是table 则返回

return object

elseif type(object) == "function" then ---只是用来测试

print("************************my object is a function value ");

end

for key, value in pairs(object) do -------深度遍历表

local var = _copy(value)

local var_key = _copy(key)

if var_key == KEY then

print("i!!!!!!!!!!!!!!finding the VAR_KEY");

search_key = var_key; ---找到了key值,应该返回value值才对

search_value = object[ var_key ];

end

end

-- return search_key,search_value

return search_value

end

return _copy(object)

end

------深度克隆一个值----

setmetatable(child,

{__index = function( table , key ) ---根据key索引,遍历所有父类,index传递的是两个参数,table和key(索查字段),

return search( parents, key );

end}

)

function child:new()

local o = {};

setmetatable(o, child);

child.__index = child;

return o;

end

return child;

end

local test1 = { b = "game",

c = "next",

d = "lalal",

func = function()

print("call father class")

end,

e = {

a = "23",

funcc = function()

print("cal value funcc");

end,

}

}

local test2 = { b = "gameover",

c = "nextover",

d = "lalalover",

func1 = function()

print("call father class two")

end,

}

local test3 = {}

function test3.callin()

print("function test3 calling ");

end

print("&*&*&*&*&*&*&*&*multiple class test begining:&*&*&*&*&*&*&*&*&*&*&")

local newclass = {}

function newclass:ctor()

--print("init newclass!!");

end

newclass = classmultiple( "TestingClass" , test1, test2 ,test3 ):new(); ---返回实例对象

print("****************************************call newclass function:")

print(newclass:callin())

print("classmultiple finishing !!^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!")

--print("multiple end");

至于那个search函数参考了quick 里面,functions.lua文件里面的clone(深度拷贝一个值)函数。至于原理嘛,简单说一下。

根据lua的元表当调用table的值或者函数时,当前table没有,且设置了matetable的话,lua会帮你遍历你所设置的metetable,如果有调用的值或者函数。

quick 里面的class函数就是这样实现的。而这里的多继承只是将多表(父类)归并到了一个表当中,然后再将新类的matetable 的__index 字段 设置为

search函数(深度遍历搜索)。这样,当新类的实例对象调用不存在的值(lua里面函数也可以是值哦)时,就会调用search函数,深度遍历所有基类的值。

好啦,误人子弟就到这里了。代码写得一坨坨的,懒得修改了,就这样吧。

继续阅读