1. 程式人生 > >cocos-Lua中的class與require機制

cocos-Lua中的class與require機制

繼承 manager 包含 logic str src 傳參數 loaded 全局變量

cocos-Lua中的class與require機制

local layer = require("PaiGow.src.GamePlayerListLayer")

local GameTableUI = class("GameTableUI", require("gamemanager.GameViewBase"));

一開始,我是不懂加載某個類後是怎麽傳參數和怎麽調用類裏面的構造函數ctor的

一般我們加載其他類的時候是用require

這裏說明一下: require函數
要加載一個模塊,只需要簡單地調用require “<模塊名>”就可以了。這個調用會返回一個由模塊函數組成的table,並且還會定義一個包含該table的全局變量。但是,這些行為都是由模塊完成的,而非require。
所以,有些模塊會選擇返回其它值,或者具有其它的效果。

require會將返回值存儲到table package.loaded中;如果加載器沒有返回值,require就會返回table package.loaded中的值。可以看到,我們上面的代碼中,模塊沒有返回值,而是直接將模塊名賦值給table package.loaded了。這說明什麽,package.loaded這個table中保存了已經加載的所有模塊

require如何加載
1.先判斷package.loaded這個table中有沒有對應模塊的信息;
2.如果有,就直接返回對應的模塊,不再進行第二次加載;
3.如果沒有,就加載,返回加載後的模塊。

在C++中構造函數是在成員變量分配內存空間的時候來調用構造函數來初始化

在Lua中怎麽說呢,其實它的做法是參照C++的,但相對來說,運用的的方法不一樣

Lua中傳參是運用create函數
local layer = require("PaiGow.src.GamePlayerListLayer"):create(self, self.tableLogic._deskUserList);

一般在聲明類的時候
local GameResultLayer = class("GameResultLayer", require("ui.BaseLayer"));


定義了類名GameResultLayer,繼承的ui.BaseLayer類


最重要的是在這個時候,它是運用了Lua中的function裏面的class函數來聲明

其中還說明了類中參數的傳遞與構造函數的調用

if not cls.ctor then
-- add default constructor
cls.ctor = function() end
end
cls.new = function(...)
local instance
if cls.__create then
instance = cls.__create(...)
else
instance = {}
end
setmetatableindex(instance, cls)
instance.class = cls
instance:ctor(...)
return instance
end
cls.create = function(_, ...)
return cls.new(...)
end

在我們require是運用create函數,其實就是調用cls.new(...),其中來使用instance:ctor(...)

cocos-Lua中的class與require機制