1. 程式人生 > >cocos2dx-lua 對lua專案中class(sub,super)的理解

cocos2dx-lua 對lua專案中class(sub,super)的理解

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 cls end

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

                                    2017.2.6

相關推薦

cocos2dx-lua lua專案class(sub,super)的理解

lua 模擬面向物件的繼承通常是通過class方法,今天簡析一下對class的理解,先例子 local MyApp = class("MyApp", cc.load("mvc").AppBase) 這是MyApp裡的一個方法繼承語句,class方法內部

專案Vuex用法的分析

上週五剛釋出一個線上版本,趁著新的需求和bug還沒到來,決定分析一下正在維護的一個使用Vue 2.0 開發的後臺管理系統中Vuex部分程式碼。這部分程式碼不是我寫的,加上我一直在“使用”現成的而不是“搭建”專案,所以這是一個很好的提升。 使用npm安裝vuex,在src檔案下建立store資料夾,如下:

使用 Intervention/image Laravel 專案的圖片進行處理

在 Laravel 5 中整合 Intervention Image 實現對圖片的建立、修改和壓縮處理 Intervention Image是一個PHP圖片操作處理庫,為圖片建立、修改及壓縮等處理提供了便捷方式。此外,還提供了服務提供者和門面以便整合到Laravel應用中。

實際專案的get請求中文亂碼以及post請求中文亂碼的解決方案

1.解決post請求的中文亂碼問題 (1)在專案中web.xml配置檔案中加入: <filter> <filter-name>CharacterEncodingFilter&

faster rcnn rpn層的理解

height 圖片 http 預測 解決辦法 tar mat proposal 而是 1.介紹 圖為faster rcnn的rpn層,接自conv5-3 圖為faster rcnn 論文中關於RPN層的結構示意圖 2 關於anchor: 一般是在最末層

Django模型的objects 的理解

object======是模型屬性---用於模型物件和資料庫互動       object = Manager() 是管理器型別的物件      是Model和資料庫進行查詢的介面     可以自定義管理器物件 -----books = models.Manager()  

[cocos2dx]cocos2dx-luaclass語法

在lua中,可以通過元表來實現類、物件、繼承等。與元表相關的方法有setmetatable()、__index、getmetatable()、__newindex。 關鍵:實現Lua面向物件可以分解為類的定義和類的例項化兩個問題。類的定義主要是實現繼承,即怎麼讓子類擁有父類

在C++專案引入Lua(AlphaGo使用的方案)

       最近大火的AlphaGo,其中的deepmind已經開源,可以到github中下載https://github.com/deepmind/lab·,網上還有一個基於Python開源AlphaGo,那個不是google的。通

luaclass的一種實現方式,單例擴充

方式 tab 方法 span 實用 ble 核心 攔截 說我 先上代碼 1 local _class={} 2 3 function class(super,singleton) 4 local class_type={} 5

cocos2d-x luaclass的定義

在lua中要實現對類的定義一般都是通過metatable來做到的。。例如: Fjs = {} function Fjs:new(name) local out = {} setmetatable(out, self) self.__index = self out

(轉 )UnityLua的編輯器拓展

wid isnull view 菜單 操作 out rec 平臺 src 轉 http://blog.csdn.net/ZhangDi2017/article/details/61203505 當前版本的Unity(截至Unity5.5.x)中TextAsset類不支持後

lua表的優化最終達到一個可以接受的地步

總結 ray 大小 key 包括 .com 最好的 緩存 分表 這種通過在table中插入多個table的方式,每個子table為hash的存儲方式。仔細分析一下存儲的類型,對於table而言,其基本的存儲方式分為hash和array兩種方式。hash的存儲會有較快的讀取操

vue專案傳送請求獲取到的資料渲染到介面之後無法其進行DOM操作的問題

vue.js通常鼓勵開發人員沿著“資料驅動”的方式思考,避免直接接觸DOM。this.$nextTick()將回調延遲到下次DOM更新迴圈之後執行。在修改資料之後立即使用它,然後等待DOM更新。它跟全域性方法vue.nextTick一樣,不同的是回撥的this自動繫結到呼叫它的例項上。 &nbs

vue專案,如何static資料夾下的靜態檔案新增時間戳,以達到清除快取

例如config.js檔案是存放在static資料夾下,裡面存放的是websocket資訊,需要經常改動。改動了以後由於快取資訊,使其不生效,因此需要對引入的檔案新增時間戳。 方法如截圖所示: <script id="main"></script><script type="

Vuejs在v-for,利用index來第一項新增class的方法

1.為li列表首項新增選中樣式: <li v-for="(items,index) in currentImgList" class="imgLiClass" :class="{'active': !index}"></li> 或者 <li v-for="(

lua 13 模組(類似class)與包

轉自: http://www.runoob.com/lua/lua-modules-packages.html   模組類似於一個封裝庫,從 Lua 5.1 開始,Lua 加入了標準的模組管理機制,可以把一些公用的程式碼放在一個檔案裡,以 API 介面的形式在其他地方呼叫,有利於程式碼的重用和

簡單談談我Java Class.forName()、Class.class、例項物件.getClass() 三種獲取位元組碼物件的理解?(內含程式碼分析和總結)

首先得明白的知識點: 1靜態屬性初始化載入類的時候初始化( 只會初始化一次),而非靜態屬性的初始化就是new類例項物件的時候初始化的 2三種獲取位元組碼物件的共同點就是都會預先的判斷記憶體是否已經載入此類,弱沒有載入,則會把.class檔案裝入到記憶體,若是載入了,則會根據class檔案生成例

cocos2dx 3.0 lua 關於listview和item點選和滑動的觸控吞噬問題

cocos版本3.15,使用studio編輯介面  -- 建立item local item1 =Item:create(array[index])item1:setPosition(pos) self.ui.listview:addChild(item1) item是

Vue專案axios進行封裝以及api介面請求

對axios進行封裝: /*   定義一個ajax請求函式,並且其返回值: promise物件(非同步返回的資料是: response.data)   */ import axios from 'axios'; export default function ajax (

vue 前端null的處理,專案使用v-if判斷陣列長度是,length報錯?

說明:以前做伺服器開發的時候,前端人員總是說,不要傳null過來,不要傳null過來,傳“”空字串過來都可以。當時就想,為啥不能傳null,你前端做下判斷不就行了嗎。 沒想到現在自己既開發前端,又開發後臺,就遇到了這個問題。 其實真的就是坐下 !=null就可以了。 例子: &nbs