一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Lua - Lua面向對象編程學習筆記

Lua面向對象編程學習筆記

2020-04-18 11:18Lua中文手冊 Lua

這篇文章主要介紹了Lua面向對象編程學習筆記,本文講解了Lua中實現類的例子、類之間繼承的例子等內容,需要的朋友可以參考下

其實 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 方法。

 

延伸 · 閱讀

精彩推薦
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

    這篇文章主要介紹了Lua實現__add方法重載示例,本文直接給出實現代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

    這篇文章主要介紹了Lua中table庫函數方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執行字符串中Lua代碼的方法,類似JavaScript中eval函數的功能,在Lua中也可以實現,需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監控賦值、通過table給另一個table賦值等內容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規范、全局變量、類型與值等內容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
主站蜘蛛池模板: 国产一区在线 | 奇米9999 | 91国产在线播放 | 欧美日韩一区二区三区免费 | 精品一区二区三区 不卡高清 | 久久这里只有精品视频e | 继攵催眠女乱h调教 | 双性np玩烂了np欲之国的太子 | 亚洲 欧美 国产 在线观看 | 精品免费久久久久久成人影院 | 男生同性啪视频在线观看 | 国产三级精品三级男人的天堂 | 青青操在线 | 轻轻操在线视频 | 欧美另类videos另类粗暴 | 天天做天天爱天天操 | 91国产在线播放 | 性妲己| 8x8拨擦拨擦华人免费 | 美女大鸡鸡 | 潘金莲西门庆一级淫片aaaaaa | 国产爱啪啪 | 亚洲2卡三卡4卡5卡精品 | 久久久久夜 | 99re热这里只有精品视频 | 免费理伦片高清在线 | 欧美一卡2卡3卡无卡 | 国产一成人精品福利网站 | 亚洲 欧美 成人 | 亚洲国产成人精品无码区99 | 欧美国产日韩1区俺去了 | 无耻之徒第十一季在线观看 | www亚洲视频 | 国内精品久久久久久久久久久久 | 2015小明台湾永久区域免费 | 亚洲久草 | 秘书小说| 狠狠操社区 | 娇妻与公陈峰姚瑶小说在线阅读 | 亚洲国产99 | 色噜噜亚洲男人的天堂www |