終于來了,在Lua中的面向?qū)ο缶幊?,相信目前學(xué)習(xí)Lua的大部分人都是為了開發(fā)手機(jī)網(wǎng)游吧。
而且基本都是奔著腳本語言的熱更新特性去的,所以全腳本開發(fā)變得十分流行。
對(duì)于普及不太廣的Lua(相對(duì)于C++、Java等主流語言),需要短時(shí)間上手開發(fā)游戲,對(duì)新手而言不算簡(jiǎn)單。
所以大家才更習(xí)慣于繼續(xù)用面向?qū)ο笏枷肴フ垓vLua吧~
好了,不嘮叨了,我最不喜歡嘮叨了。(小若:是是是,你一點(diǎn)都不嘮叨,趕緊開講?。?/p>
1.類的對(duì)象
至于如何創(chuàng)建一個(gè)類,大家已經(jīng)很清楚了,就是一個(gè)table而已。
那么,要使用這個(gè)類去創(chuàng)建多個(gè)對(duì)象,又如何實(shí)現(xiàn)呢?
使用元表和元方法即可。
如下代碼:
留意TSprite的new函數(shù),函數(shù)里創(chuàng)建了一個(gè)新的table,并且給新的table設(shè)置一個(gè)元表,這個(gè)元表的__index元方法就是TSprite本身,最后返回這個(gè)新的table。
于是,所有通過new生成的新table,都可以使用TSprite的函數(shù)和各個(gè)字段屬性(因?yàn)開_index的值是TSprite)。
因此,我們利用new函數(shù)創(chuàng)建了who1和who2,并且調(diào)用它們的setPosition函數(shù),最后,who1和who2的x、y值都是不同的。
這就是類的對(duì)象了。
2.類對(duì)象的__index都是同一個(gè)TSprite,為什么x、y值可以不相同?
不知道大家有沒有這樣一個(gè)疑惑,那就是,為什么who1和who2的x、y是不一樣的,它們最終調(diào)用的不是setPosition函數(shù)么?調(diào)用self.x時(shí)最終不是調(diào)用了TSprite的x值么?
這里是會(huì)有點(diǎn)混亂,理一理就沒問題了:
1). 當(dāng)who1里不存在setPosition時(shí),回去__index元方法里查找,于是,會(huì)找到TSprite的setPosition函數(shù)
2). 在setPosition函數(shù)里,使用了self.x = x,此時(shí)的self就是who1,who1中是不存在x字段的,所以,如果我們要打印self.x的值,則其實(shí)是打印了TSprite的x值
3). 但是,注意,但是來了。__index元方法是用于調(diào)用的,而不是用于賦值的,因此,self.x = x這句話,其實(shí)只是給who1這個(gè)table的x字段賦值了,who1本身不存在x字段,此時(shí)給它賦值了,于是who1存在了x字段,以后who1都不會(huì)再去TSprite里查找x字段了。
4). 因此,對(duì)who1和who2的x、y字段進(jìn)行賦值操作時(shí),是完全不會(huì)影響到TSprite的。
3.節(jié)省資源——使用TSprite作為元表
我們?cè)僮屑?xì)觀察一下new函數(shù),我們?cè)诮o新table設(shè)置元表的時(shí)候,是重新創(chuàng)建了一個(gè)元表的:setmetatable(o, {__index = self});
這么做的話,每次調(diào)用new函數(shù)創(chuàng)建一個(gè)新對(duì)象時(shí),都會(huì)產(chǎn)生一個(gè)新的元表,雖然這開支似乎可以忽略,但,擁有強(qiáng)迫癥的你,一定很喜歡下面的代碼:
在這段新的new函數(shù)里,使用self作為元表,然后又使用self作為__index的值。
這么一看,有點(diǎn)繞不過來,我就喜歡大家繞不過來,這樣我又可以嘮叨了:
1). 調(diào)用new函數(shù)時(shí),self其實(shí)就是TSprite本身,這里完全可以用TSprite代替,不過,為了給以后做鋪墊,這里還是使用self吧。
2). self.__index = self,不要被這句代碼嚇到了,其實(shí)還是那么一回事,設(shè)置元表的__index元方法,這里就 相當(dāng)于TSprite.__index = TSprite。
3). TSprite自己作為__index的值沒問題么?確實(shí)沒問題,TSprite也是一個(gè)table,table可以作為元表,元表可以有__index元方法,這絲毫沒有英雄。
4). 于是,通過這個(gè)小技巧,我們就避免了每次調(diào)用new函數(shù)時(shí)都額外創(chuàng)建一個(gè)新的元表了。
4.富二代什么的我才不喜歡——繼承
我們總是笑話富二代,但誰的內(nèi)心深處不希望自己是一個(gè)富二代呢~
像我這種立志靠自己成為富一代的人,可不多了~(小若:啊我呸~!)
那么,在Lua里如何實(shí)現(xiàn)繼承呢?很簡(jiǎn)單,但是需要認(rèn)真思考,如下代碼:
此時(shí),我們修改了MoneySprite的setPosition函數(shù),于是,調(diào)用MoneySprite的setPosition函數(shù)時(shí),與TSprite無關(guān)了。
但,這不是重點(diǎn),重點(diǎn)是接下來的代碼:
我們?cè)俅握{(diào)用MoneySprite的new函數(shù)創(chuàng)建了一個(gè)新對(duì)象。
這又是什么情況呢?關(guān)鍵是new函數(shù)里的代碼,此時(shí),new函數(shù)里的self是誰?
new函數(shù)是由MoneySprite調(diào)用的,因此,self就是MoneySprite。
于是新對(duì)象的元表就是MoneySprite,元表的__index也是MoneySprite。
因此~!很神奇的,調(diào)用who的setPosition函數(shù)的時(shí)候,其實(shí)也是調(diào)用了MoneySprite的setPosition函數(shù)。
于是,who就是是MoneySprite的對(duì)象,而MoneySprite就是TSprite的子類。
來看看輸出結(jié)果吧:
5.結(jié)束
不知不覺這個(gè)系列的文章已經(jīng)寫了20篇了,真是太出乎我的意料了。
我竟然可以堅(jiān)持下來,但寫文章的效果確實(shí)很好,每晚的1個(gè)多小時(shí)付出也很值得。
起碼,我對(duì)Lua基礎(chǔ)的理解又更加鞏固了~
好吧,繼續(xù)堅(jiān)持…(小若:所以說啊~!為什么每次都要用省略號(hào),用感嘆號(hào)不是更能表達(dá)你的決心嗎…)
標(biāo)簽:黑龍江 嘉峪關(guān) 張掖 武漢 宜賓 延邊 江西 新余
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua面向?qū)ο笾惡屠^承》,本文關(guān)鍵詞 Lua,面向,對(duì),象之,類和,繼承,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。