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函数,深度遍历所有基类的值。

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






















  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值