亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua面向對象之類和繼承

2024-07-21 23:04:04
字體:
來源:轉載
供稿:網友

終于來了,在Lua中的面向對象編程,相信目前學習Lua的大部分人都是為了開發手機網游吧。

而且基本都是奔著腳本語言的熱更新特性去的,所以全腳本開發變得十分流行。
對于普及不太廣的Lua(相對于C++、Java等主流語言),需要短時間上手開發游戲,對新手而言不算簡單。

所以大家才更習慣于繼續用面向對象思想去折騰Lua吧~

好了,不嘮叨了,我最不喜歡嘮叨了。(小若:是是是,你一點都不嘮叨,趕緊開講!)

1.類的對象

至于如何創建一個類,大家已經很清楚了,就是一個table而已。
那么,要使用這個類去創建多個對象,又如何實現呢?
使用元表和元方法即可。
 
如下代碼:

復制代碼 代碼如下:

    TSprite = {
        x = 0,
        y = 0,
    }
    function TSprite:setPosition(x, y)
        self.x = x;
        self.y = y;
    end
  
    function TSprite:new()
        o = {}
        setmetatable(o, {__index = self});
        return o;
    end
  
    local who1 = TSprite:new();
    local who2 = TSprite:new();
    who1:setPosition(1, 2);
    who2:setPosition(44, 6);
    print("who1坐標(" .. who1.x .. "," .. who1.y .. ")");
    print("who2坐標(" .. who2.x .. "," .. who2.y .. ")");

 

留意TSprite的new函數,函數里創建了一個新的table,并且給新的table設置一個元表,這個元表的__index元方法就是TSprite本身,最后返回這個新的table。

于是,所有通過new生成的新table,都可以使用TSprite的函數和各個字段屬性(因為__index的值是TSprite)。

因此,我們利用new函數創建了who1和who2,并且調用它們的setPosition函數,最后,who1和who2的x、y值都是不同的。
這就是類的對象了。

2.類對象的__index都是同一個TSprite,為什么x、y值可以不相同?

不知道大家有沒有這樣一個疑惑,那就是,為什么who1和who2的x、y是不一樣的,它們最終調用的不是setPosition函數么?調用self.x時最終不是調用了TSprite的x值么?
這里是會有點混亂,理一理就沒問題了:

1). 當who1里不存在setPosition時,回去__index元方法里查找,于是,會找到TSprite的setPosition函數
2). 在setPosition函數里,使用了self.x = x,此時的self就是who1,who1中是不存在x字段的,所以,如果我們要打印self.x的值,則其實是打印了TSprite的x值
3). 但是,注意,但是來了。__index元方法是用于調用的,而不是用于賦值的,因此,self.x = x這句話,其實只是給who1這個table的x字段賦值了,who1本身不存在x字段,此時給它賦值了,于是who1存在了x字段,以后who1都不會再去TSprite里查找x字段了。
4). 因此,對who1和who2的x、y字段進行賦值操作時,是完全不會影響到TSprite的。

3.節省資源——使用TSprite作為元表

我們再仔細觀察一下new函數,我們在給新table設置元表的時候,是重新創建了一個元表的:setmetatable(o, {__index = self});

這么做的話,每次調用new函數創建一個新對象時,都會產生一個新的元表,雖然這開支似乎可以忽略,但,擁有強迫癥的你,一定很喜歡下面的代碼:

復制代碼 代碼如下:

    function TSprite:new()
        o = {}
        setmetatable(o, self);
        self.__index = self;
        return o;
    end

 

在這段新的new函數里,使用self作為元表,然后又使用self作為__index的值。

這么一看,有點繞不過來,我就喜歡大家繞不過來,這樣我又可以嘮叨了:
1). 調用new函數時,self其實就是TSprite本身,這里完全可以用TSprite代替,不過,為了給以后做鋪墊,這里還是使用self吧。
2). self.__index = self,不要被這句代碼嚇到了,其實還是那么一回事,設置元表的__index元方法,這里就 相當于TSprite.__index = TSprite。
3). TSprite自己作為__index的值沒問題么?確實沒問題,TSprite也是一個table,table可以作為元表,元表可以有__index元方法,這絲毫沒有英雄。
4). 于是,通過這個小技巧,我們就避免了每次調用new函數時都額外創建一個新的元表了。

4.富二代什么的我才不喜歡——繼承

我們總是笑話富二代,但誰的內心深處不希望自己是一個富二代呢~
像我這種立志靠自己成為富一代的人,可不多了~(小若:啊我呸~?。?br />  
那么,在Lua里如何實現繼承呢?很簡單,但是需要認真思考,如下代碼:

復制代碼 代碼如下:

    TSprite = {
        x = 0,
        y = 0,
    }
    function TSprite:setPosition(x, y)
        self.x = x;
        self.y = y;
    end
  
    function TSprite:new()
        o = {}
        setmetatable(o, self);
        self.__index = self;
        return o;
    end
  
    local MoneySprite = TSprite:new();
    function MoneySprite:setPosition(x, y)
        print("呵呵,我是富二代,根本不需要改變。");
    end

TSprite仍然沒變,但是,我們看看MoneySprite,按之前的理解,它是TSprite的一個對象。
只是,“對象”這稱呼是我們自己定的,實際上它還是一個table而已。

 

此時,我們修改了MoneySprite的setPosition函數,于是,調用MoneySprite的setPosition函數時,與TSprite無關了。

但,這不是重點,重點是接下來的代碼:

復制代碼 代碼如下:

    local who = MoneySprite:new();
    who:setPosition(44, 6);
  
    print("who坐標(" .. who.x .. "," .. who.y .. ")");

 

我們再次調用MoneySprite的new函數創建了一個新對象。
這又是什么情況呢?關鍵是new函數里的代碼,此時,new函數里的self是誰?
new函數是由MoneySprite調用的,因此,self就是MoneySprite。
于是新對象的元表就是MoneySprite,元表的__index也是MoneySprite。

因此~!很神奇的,調用who的setPosition函數的時候,其實也是調用了MoneySprite的setPosition函數。

于是,who就是是MoneySprite的對象,而MoneySprite就是TSprite的子類。

來看看輸出結果吧:

復制代碼 代碼如下:

[LUA-print] 呵呵,我是富二代,根本不需要改變。
[LUA-print] who坐標(0,0)

怎么樣?繼承的實現方法也很簡單吧?
如果對元表、元方法、self比較生疏的話,可能一時間會理解不過來,沒關系,多思考一會,或者隔天再回頭思考,就會豁然開朗了。

 

5.結束

不知不覺這個系列的文章已經寫了20篇了,真是太出乎我的意料了。
我竟然可以堅持下來,但寫文章的效果確實很好,每晚的1個多小時付出也很值得。
起碼,我對Lua基礎的理解又更加鞏固了~
 
好吧,繼續堅持…(小若:所以說啊~!為什么每次都要用省略號,用感嘆號不是更能表達你的決心嗎…)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久天堂| 欧美肥臀大乳一区二区免费视频| 97视频免费在线看| 久久免费精品日本久久中文字幕| 51视频国产精品一区二区| 孩xxxx性bbbb欧美| 欧美日韩精品在线播放| 91精品久久久久久久久久久久久久| 亚洲欧洲第一视频| 欧美色xxxx| 亚洲区一区二区| 久久久久久久999精品视频| 久久夜色精品亚洲噜噜国产mv| 91精品久久久久久久久久久久久| 久久久久久av| 欧美性色xo影院| 欧美中文字幕视频在线观看| 欧美性xxxxx极品娇小| 国产精品久久精品| 日韩中文字幕免费| 久久亚洲一区二区三区四区五区高| 亚洲香蕉在线观看| 日韩经典一区二区三区| 久久综合五月天| 97色在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲国模精品私拍| 亚洲第一av网| 久久噜噜噜精品国产亚洲综合| www.国产精品一二区| 91亚洲永久免费精品| 91国产中文字幕| 国产日产久久高清欧美一区| 91黑丝在线观看| 成人免费淫片视频软件| 欧美色视频日本版| 欧美激情综合亚洲一二区| 日本精品一区二区三区在线播放视频| 欧美国产视频一区二区| 亚洲精品久久久久久久久久久久| 亚洲国产精品电影在线观看| 日韩成人久久久| 亚洲欧美三级在线| 成人国内精品久久久久一区| 欧美成人免费在线视频| 亚洲欧美国产另类| 久久久久久久久久久免费精品| 欧美精品videossex性护士| 国产精品视频久久久久| 日韩av一卡二卡| 欧美大片欧美激情性色a∨久久| 爽爽爽爽爽爽爽成人免费观看| 国产成人拍精品视频午夜网站| 日韩美女视频免费在线观看| 国产亚洲一区二区精品| 精品亚洲一区二区三区在线观看| 亚洲国产精品久久久久秋霞蜜臀| 在线观看亚洲视频| 成人av电影天堂| 成人国产精品免费视频| 亚洲一二在线观看| 久久大大胆人体| 97超碰蝌蚪网人人做人人爽| 欧美黄网免费在线观看| 91精品国产一区| 国产婷婷成人久久av免费高清| 91大神福利视频在线| 欧美视频免费在线观看| 亚洲精品www久久久| 成人福利视频在线观看| 欧美精品福利视频| 精品久久久久久国产91| 欧洲成人免费aa| 久久福利视频导航| 欧美午夜无遮挡| 久久久久www| 国产精品专区h在线观看| www日韩中文字幕在线看| 美女国内精品自产拍在线播放| 6080yy精品一区二区三区| 国产精品旅馆在线| 国产欧美一区二区三区在线| 中文字幕久精品免费视频| 色av吧综合网| 亚洲a∨日韩av高清在线观看| 日本19禁啪啪免费观看www| 欧美性生交大片免网| 色婷婷综合成人| 91在线高清免费观看| 亚洲最新视频在线| 久久艹在线视频| 欧美日韩国产成人高清视频| 国产情人节一区| 91亚洲精品一区二区| 亚洲爱爱爱爱爱| 日韩免费观看网站| 国产成人激情小视频| 久久久久久久久久久91| 岛国视频午夜一区免费在线观看| 国产不卡一区二区在线播放| 91国产视频在线| 亚洲欧美日韩中文视频| 久久综合久久88| www国产精品视频| 一区二区三区天堂av| 亚洲美女av电影| 亚洲黄色在线观看| 亚洲中国色老太| 萌白酱国产一区二区| 欧美激情久久久久久| 欧美成人黑人xx视频免费观看| 欧美性少妇18aaaa视频| 日本高清久久天堂| 久热99视频在线观看| 日韩在线观看免费高清| 国产精品久久久久77777| 欧美成人合集magnet| 日本一区二区在线播放| 久久精品视频在线观看| 亚洲激情国产精品| 亚洲精品91美女久久久久久久| 国产剧情久久久久久| 日韩激情视频在线| 亚洲电影免费观看| 久久久91精品国产一区不卡| 精品动漫一区二区| 国产精品视频久久久久| 欧美日韩亚洲一区二区| 欧美性少妇18aaaa视频| 91精品在线播放| 日韩欧美主播在线| 欧美交受高潮1| 国产精品美女999| 亚洲精品久久久久中文字幕二区| 欧美性资源免费| 国产精品视频精品视频| 日韩成人久久久| 成人av.网址在线网站| 亚洲成人免费在线视频| 亚洲va国产va天堂va久久| 国产精品麻豆va在线播放| 热久久美女精品天天吊色| 欧美一级电影在线| 日韩免费不卡av| 九色91av视频| 亚洲福利视频久久| 久久久99久久精品女同性| 日韩a**中文字幕| 欧日韩不卡在线视频| 国产视频在线一区二区| 日韩电影网在线| 国产精品激情av电影在线观看| 日韩av免费观影| 久久久最新网址| 亚洲成人网在线观看| 亚洲欧美日韩综合| 色悠久久久久综合先锋影音下载| 国产精品中文久久久久久久| 欧美一区二区三区精品电影| 欧美成人精品一区| 久久久久久亚洲精品中文字幕| 亚洲最大的网站| 国内精久久久久久久久久人| 欧美孕妇性xx|