標籤:lua cocos2d-x
Cocos2d-x 指令碼語言Lua中的物件導向
物件導向不是針對某一門語言,而是一種思想,在面向過程的語言也可以使用物件導向的思想來進行編程。在Lua中,並沒有物件導向的概念存在,沒有類的定義和子類的定義,但同樣在Lua中可以利用物件導向的思想來實現物件導向的類繼承。
一、複製表的方式物件導向
--Lua中的物件導向--[[ 複製表方式物件導向 參數為一張表,通過遍曆這張表取值,賦給一張空表,最後返回建立的表,來達到複製表]]function clone(tab)local ins = {}for key, var in pairs(tab) doins[key] = varendreturn insend--[[ 複製表 第一參數是目標表,第二個參數是需要複製的表 通過遍曆tab來取值將它賦值到目標表中]]function copy(dist,tab)for key, var in pairs(tab) dodist[key] = varendend-- 定義一張空表,相當於一個類People ={}--function People.sayHi()--print("People say hi")--end-- 定義類中的方法sayHi,傳入一個self參數People.sayHi = function (self)print("People say hi:"..self.name)end-- 定義一個new方法,傳進一個name參數,通過複製People這張表來產生一個對象-- 相當於類當中的一個構造方法People.new = function (name)local self = clone(People)self.name = namereturn selfend--local p = clone(People)--p.sayHi()--產生一個新的對象local p = People.new("ZhangSan")--p.sayHi(p)--p:sayHi()--定義一張空表,也代表一個類Man = {}--Man中的構造方法,實現Lua中類的繼承Man.new = function (name)local self = People.new(name)--附加Man中所有的索引值對到People中的執行個體中去copy(self,Man)return selfendMan.sayHello = function ()print("Man say hello")end--重寫父類People中的sayHi方法Man.sayHi = function (self)print("Man sayHi "..self.name)end--建立Man的一個執行個體local m = Man.new("Lisi")m:sayHi()
以上代碼已經有詳細的注釋,讀者需要仔細閱讀這裡所給出的例子。
二、使用函數閉包的形式實現物件導向
--以函數閉包的形式實現物件導向--定義一個方法,函數閉包實現一個類的概念function People(name)local self = {} --初始化方法,私人的local function init()self.name = nameend self.sayHi = function ()print("Hello "..self.name)end --調用初始化init()return selfend--執行個體化一個對象local p = People("ZhangSan")p:sayHi()--函數閉包的形式實作類別繼承function Man(name)local self = People(name)--local function init()----endself.sayHello = function ()print("Hi "..self.name)endreturn selfendlocal m = Man("Lisi")--m:sayHello()m:sayHi()
以上兩種方式均可實現物件導向,目測第二種方法更為簡潔一些,具體使用按照個人的喜好來做。