国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

cocos2dx-lua 對lua項目中class(sub,super)的理解

2019-11-09 18:27:13
字體:
來源:轉載
供稿:網友
lua 模擬面向對象的繼承通常是通過class方法,今天簡析一下對class的理解,先例子local MyApp = class("MyApp", cc.load("mvc").AppBase)

這是MyApp里的一個方法繼承語句,class方法內部兩個參數,一個是新建類簡稱A ,另一個是A繼承的父類的類簡稱B,這句代碼可以使得生成的A類繼承B類后返回名為MyApp的新的子類。 重點內容 問題,class方法是如何實現模擬lua繼承的呢? class有三種繼承情況, 1、第一種是繼承一個方法,

local LogoScene = class("LogoScene", function() return cc.Scene:create()end)

2、第二種繼承一個C語言原生類

local LogoScene = class("LogoScene", cc.Scene)

3、繼承一個lua類

local LogoScene = class("LogoScene", {})

下面看一下面class的代碼

function class(classname, ...) local cls = {__cname = classname} --這里可以看出lua的cocos模擬的class方法支持多繼承 local supers = {...} for _, super in ipairs(supers) do local superType = type(super) assert(superType == "nil" or superType == "table" or superType == "function", string.format("class() - create class /"%s/" with invalid super class type /"%s/"", classname, superType)) --這里是class繼承的第一種情況,繼承一個方法(在子類new之前先執行的內建函數__create) if superType == "function" then assert(cls.__create == nil, string.format("class() - create class /"%s/" with more than one creating function", classname)); -- if super is function, set it to __create --如果super是一個方法,把super直接復制給內建函數__create cls.__create = super --下面是class的第二,第三種情況,當傳過來的值是table類型的時候 --這里需要明確的一點是,在lua里table其實還分兩種,一種是lua的table,另一種是c里轉換過來的一種類型叫userTable,在用tolua++綁定cocos2dx引擎的時候,tolua++會為userTable類型的類在執行create方法的時候為其加入.isclass屬性(大家可以用執行dump(cc.Layer)觀察) elseif superType == "table" then --下面這種是第二種情況 --如果有.isclass這個值則說明是從c++轉換過來的數據結構 if super[".isclass"] then -- super is native class assert(cls.__create == nil, string.format("class() - create class /"%s/" with more than one creating function or native class", classname)); --這里可以看出這種繼承了c結構的子類其實也只是執行子類之前執行了一個創建父類對象的方法 cls.__create = function() return super:create() end else --后面這個是第三種情況,子類是lua繼承的父類也是lua,這里有另一個內建函數__supers,他的作用是存放父類數組(父類可能不止一個) -- super is pure lua class cls.__supers = cls.__supers or {} cls.__supers[#cls.__supers + 1] = super if not cls.super then -- set first super pure lua class as class.super cls.super = super end end else error(string.format("class() - create class /"%s/" with invalid super type", classname), 0) end end --__index方法是一個“操作指南” --下面的__index對于繼承功能的模擬也很關鍵 --更簡單的說就是在我調用方法的時候,class是如何實現繼承功能的(當子類搜索自己的函數未果,就會按照__index的指引去搜索父類,去尋找方法) cls.__index = cls --如果子類的父類不存在或者只存在只有一個,那么把索引方法指向唯一的父類 if not cls.__supers or #cls.__supers == 1 then setmetatable(cls, {__index = cls.super}) else --如果子類的存在多個父類,那么把索引方法會遍歷所有的父類 setmetatable(cls, {__index = function(_, key) local supers = cls.__supers for i = 1, #supers do local super = supers[i] if super[key] then return super[key] end end end}) end if not cls.ctor then -- add default constructor cls.ctor = function() end end --這里的new方法是模擬cocos2dx里面的創建對象,下面的代碼一目了然 cls.new = function(...) local instance if cls.__create then --這里需要注意的一件事是, -- --local LogoScene = class("LogoScene", function(argu) -- --dump(argu) -- return cc.Scene:create() --end) --function LogoScene:ctor(argu) -- --dump(argu) --end --上面的和這個栗子如果調用 LoginScene:create(argu)方法會將argu里的參數傳到class后面的function里面,執行完function之后再執行ctor。 instance = cls.__create(...) else instance = {} end setmetatableindex(instance, cls) instance.class = cls instance:ctor(...) return instance end --這里只是為了模擬cocos2dx的編程習慣 cls.create = function(_, ...) return cls.new(...) end return clsend

到這里class的基本用法就寫完了,usertable找個數據結構涉及到lua虛擬機內部的結構,后面研究透徹之后會繼續補充。

2017.2.6
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 于田县| 甘孜县| 赞皇县| 闻喜县| 宁都县| 江陵县| 林芝县| 祁连县| 黔西| 五常市| 澜沧| 建瓯市| 鄂托克旗| 神木县| 沂源县| 连州市| 德昌县| 临武县| 南阳市| 永泰县| 罗江县| 获嘉县| 长垣县| 东海县| 新泰市| 莎车县| 延津县| 芜湖县| 阿拉尔市| 杭锦旗| 保德县| 哈巴河县| 宁明县| 铜陵市| 铜川市| 莱芜市| 唐山市| 沂水县| 富裕县| 杭锦后旗| 马尔康县|