天天看點

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函數,深度周遊所有基類的值。

好啦,誤人子弟就到這裡了。代碼寫得一坨坨的,懶得修改了,就這樣吧。

繼續閱讀