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

首頁 > 開發 > 綜合 > 正文

Lua面向對象編程學習筆記

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

其實 Lua 中的 table 是一種對象,因為它跟對象一樣,有其自己的操作方法:

 

復制代碼 代碼如下:

Role = { hp = 100 }
function Role.addHp(hp)
    Role.hp = Role.hp + hp
end
 
Role.addHp(50)
print(Role.hp)

 

上面代碼創建了一個名為 Role 對象,并有一個 addHp 的方法,執行 "Role.addHp" 便可調用 addHp 方法。

不過上面對象 Role 是以全局變量的方式創建,會有一種“全局污染”的威脅,即變量 Role 在其他地方被重新賦值(例如被賦成 nil),對象里的屬性或方法可能會面臨被銷毀或不能正常工作的情況。

對于這種問題,Lua 提供一種“接受者”的解決方法,即額外添加一個參數 self 來表示對象本身:

 

復制代碼 代碼如下:

Role = { hp = 100 }
function Role.addHP(self, hp)
    self.hp = self.hp + hp
end
r = Role
r.addHP(r, 50)
print(r.hp)

 

這樣就不怕對象 Role 被“全局污染”,因為構造了一個子對象 r,并以參數的方式傳入,以供其方法調用操作。

對于這種把對象本身以參數的方式傳入對象方法里的寫法,Lua 提供了一種更優雅的寫法,把點號(.)替換為冒號(:),這樣在方法定義或調用時,便可隱藏 self 參數。修改如下:

 

復制代碼 代碼如下:

Role = { hp = 100 }
function Role:addHp(hp)
    self.hp = self.hp + hp
end
r = Role
r:addHp(50)
print(r.hp)

 

上面的 "r.addHp(50)" 的寫法等價于 "r.addHp(r, 50)"

Lua 沒有類的概念,不過可以通過元表(metatable)來實現與原型 prototype 類似的功能,而 prototype 與類的工作機制一樣,都是定義了特定對象行為。Lua 里的原型特性主要使用元表的 __index 事件來實現,這樣當調用對象沒定義的方法時,會向其元表的 __index 鍵(事件)查找。例如有 a 和 b 兩個對象,想讓 b 作為 a 的原型 prototype,只需要把 b 設置為 a 元表的 __index 值就行:

 

復制代碼 代碼如下:

setmetatable(a, {__index = b})

這樣,當對象 a 調用任何不存在的成員都會到對象 b 中查找,a 可以擁有或調用 b 的屬性或方法,從某種意義上看,b 可以看作是一個類,a 是 b 的對象。

 

對于上面 Role 的例子,對象的創建可以用 __index 元方法來改寫,這樣新創建的對象就擁有和 Role 一樣的屬性和方法。

 

復制代碼 代碼如下:

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

 

當執行 "r = Role:new() " 創建一個對象時,r 將 Role 設置為自己的元表,那么調用 "r:addHp(50)" 的時候,會在 r 里查找 addHp 方法,如果沒有找到,則會進一步搜索其元表的 __index,因此等價于:

 

復制代碼 代碼如下:

getmetatable(r).__index.addHp(r, 50)

 

從上面的 Role:new 方法可以知道,Role 的 __index 在創建時被指定為 self,因此其實就是執行:

 

復制代碼 代碼如下:

Role.addHp(R, 50)

 

完整的類例子:

 

復制代碼 代碼如下:

Role = { hp = 100 }
function Role:new(o)
    o = o or {} 
    setmetatable(o, self)
    self.__index = self
    return o
end
function Role:addHp(hp)
    self.hp = self.hp + hp
end
 
r = Role:new()
r:addHp(50)
print(r.hp)

 

繼承

Lua 里繼承機制還是像實現類那樣實現。

假如打算從類 Role 派生出一個子類 Priest,它有一個魔法屬性值 mp,那么可以先從類 Role 構造一個 Priest,繼承類 Role 的所有屬性和方法:

 

復制代碼 代碼如下:

Priest = Role:new()

 

雖然 Priest 是 Role 的一個實例,不過它具有類 Role 的所有屬性和方法,其實也可以把它看做是從類 Role 派生出來的類,因此可以從類 Priest 繼續 new 一個對象出來:

 

復制代碼 代碼如下:

p = Priest:new({ mp = 100 })

 

上面實例 p 除了多出一個魔法屬性值 mp 外,還繼承類 Role 的所有屬性和方法,當調用 "p.addHp" 方法時,Lua 在 p 中找不到 addHp 方法,會到 Priest 中找,在 Priest 中找不到,會到 Role 中找。

因此,想重定義從父類 Role 繼承來的方法,在類 Priest 上定義即可。假如想重定義 addHp 方法:每次加血都要先判斷魔法值夠不夠,如果夠,則加血,并扣除一定的魔法值。修改如下:

 

復制代碼 代碼如下:

function Priest:addHp(hp)
    if self.mp >= 20 then
        self.mp = self.mp - 20
        self.hp = self.hp + hp
    end
end

這樣,當調用 "p:addHp" 時,Lua 會優化取類 Priest 定義的 addHp 方法。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美疯狂xxxx大交乱88av| 欧美性视频在线| 97久久伊人激情网| 久久国产精品偷| 日韩精品视频中文在线观看| 一个人看的www欧美| 午夜精品视频在线| 国产一区二区动漫| 在线视频欧美日韩精品| 亚洲一区二区黄| 国产精品欧美激情在线播放| 成人国产精品av| 久久电影一区二区| 人人做人人澡人人爽欧美| 大荫蒂欧美视频另类xxxx| 欧美性猛交xxxx免费看漫画| 亚洲欧洲一区二区三区在线观看| 久久久久999| 中文字幕av一区中文字幕天堂| 国产做受高潮69| 亚洲四色影视在线观看| 日韩精品在线观看一区二区| 亚洲精品在线观看www| 亚洲老司机av| 最新亚洲国产精品| 日韩美女视频中文字幕| 日韩免费看的电影电视剧大全| 中文字幕亚洲综合久久| 日韩动漫免费观看电视剧高清| 性日韩欧美在线视频| 高清欧美性猛交xxxx黑人猛交| 成人美女av在线直播| 欧美又大又粗又长| 亚洲欧洲中文天堂| 亚洲欧美日韩另类| 国产成人极品视频| 国产精品久久久久久久久久久久久久| 538国产精品视频一区二区| 国产精品一区二区三区久久| 亚洲精品国产精品自产a区红杏吧| 久久久精品在线观看| 国产精品亚发布| 91社区国产高清| 精品国产91久久久久久老师| 欧美性生活大片免费观看网址| 久久久久久国产精品久久| 91wwwcom在线观看| 欧美性xxxxxxx| 色偷偷av一区二区三区| 欧美在线一级va免费观看| 国产精品白嫩美女在线观看| 欧美日韩成人黄色| 亚洲男子天堂网| 免费97视频在线精品国自产拍| 国产精品视频99| 69影院欧美专区视频| 亚洲欧洲自拍偷拍| 在线观看日韩av| 日韩av网站导航| 国产精品你懂得| 亚洲视频在线观看| 91亚洲永久免费精品| 一区二区三区视频在线| 国产ts一区二区| 国产午夜精品视频免费不卡69堂| 97精品视频在线观看| 成人做爽爽免费视频| 国产精品成熟老女人| 日韩av电影国产| 亚洲精品乱码久久久久久金桔影视| 国产在线高清精品| 97视频免费在线观看| 国产脚交av在线一区二区| 日韩电视剧在线观看免费网站| 欧美黑人xxxx| 日韩av综合中文字幕| 91精品国产色综合久久不卡98口| 日韩在线播放视频| 国产成人精品免费视频| 亚洲成人激情在线观看| 7777免费精品视频| 亚洲四色影视在线观看| 亚洲网在线观看| 亚洲精品综合久久中文字幕| 国产精品久久久久久久久久免费| 狠狠躁夜夜躁久久躁别揉| 国产精品久久久久久久久免费看| 自拍视频国产精品| 中文字幕日韩专区| 亚洲女人被黑人巨大进入al| 日韩亚洲成人av在线| 亚洲另类xxxx| 亚洲bt天天射| 日韩视频免费在线观看| 国产视频999| 国产成人精彩在线视频九色| 国产精品久久久久免费a∨| 中文字幕亚洲欧美日韩2019| 中文字幕欧美精品日韩中文字幕| 一夜七次郎国产精品亚洲| 亚洲视频综合网| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲国产精品久久91精品| 国产精品亚洲аv天堂网| 在线视频日韩精品| 欧美激情视频免费观看| 91精品视频免费看| 国产成人精品免费久久久久| 国产精选久久久久久| 日韩精品在线免费| 色多多国产成人永久免费网站| 亚洲精品久久久久中文字幕欢迎你| 正在播放欧美一区| 97免费视频在线| 久久精品国产亚洲| 亚洲成色999久久网站| 国产精品福利在线观看网址| 成人性教育视频在线观看| 国产丝袜高跟一区| 91精品久久久久久久久不口人| 国产精品ⅴa在线观看h| 国产精品久久久久久久久免费看| 日韩视频免费大全中文字幕| 欧美一级大片在线免费观看| 亚洲美女在线看| 亚洲一二三在线| 精品久久久久久亚洲国产300| 国产精品电影久久久久电影网| 亚洲天堂一区二区三区| 俺去了亚洲欧美日韩| 日本一区二区三区四区视频| 精品久久久中文| 日韩一级裸体免费视频| 精品国产乱码久久久久酒店| 国产一区二区三区在线播放免费观看| 萌白酱国产一区二区| 国产91色在线|| 国产69久久精品成人| 色吧影院999| 欧美亚洲日本网站| 45www国产精品网站| 日韩视频亚洲视频| 91精品视频观看| 久久成人精品电影| 欧美黑人极品猛少妇色xxxxx| 成人两性免费视频| 国产精欧美一区二区三区| 国产欧美久久一区二区| 色偷偷偷综合中文字幕;dd| 91精品国产沙发| 国产精品自产拍在线观看中文| 成人中心免费视频| 亚洲精品一区在线观看香蕉| 久久精品影视伊人网| 欧美性猛交xxxx乱大交极品| 91理论片午午论夜理片久久| 久久国产精品久久国产精品| 国产成人精品电影| 欧美日韩成人网| 日韩欧美aⅴ综合网站发布| 日韩精品欧美国产精品忘忧草| 欧美xxxwww| 欧美最顶级丰满的aⅴ艳星| 亚洲精品美女久久久|