從事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函數,深度周遊所有基類的值。
好啦,誤人子弟就到這裡了。代碼寫得一坨坨的,懶得修改了,就這樣吧。