濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Lua 極簡(jiǎn)入門指南(七):面向?qū)ο缶幊?/div>

Lua 極簡(jiǎn)入門指南(七):面向?qū)ο缶幊?/h1>

熱門標(biāo)簽:漳州智云呼電話機(jī)器人 冀州市地圖標(biāo)注 怎么去除地圖標(biāo)注 百度地圖標(biāo)注早餐區(qū)域 新岸線智能電銷機(jī)器人 武漢外呼防封系統(tǒng)多少錢 清朝地圖標(biāo)注哈爾濱 地圖標(biāo)注大廈 個(gè)人怎么在地圖標(biāo)注需要的店鋪

在很多面向?qū)ο蟮恼Z(yǔ)言中有類(class)的概念,對(duì)象是類的實(shí)例。Lua 中不存在類的概念。Lua 就像 JavaScript 一樣是面向原型的語(yǔ)言(http://en.wikipedia.org/wiki/Prototype-based_programming),這類語(yǔ)言使用一個(gè)對(duì)象表示一個(gè)“類”,其他對(duì)象(此類的實(shí)例)使用此對(duì)象作為原型。我們有兩個(gè) table p 和 obj,將 p 設(shè)置為 obj 的原型(回顧:https://www.jb51.net/article/56690.htm):

復(fù)制代碼 代碼如下:

setmetatable(obj, {__index = p})

obj 中不存在的操作會(huì)在 p 中查找。

看一個(gè)詳細(xì)的例子:

復(fù)制代碼 代碼如下:

Account = {
    -- 默認(rèn)的 balance 的值
    balance = 0
}
 
function Account:new(o)
    o = o or {}
    -- 設(shè)置原型為 Account
    setmetatable(o, self)
    self.__index = self
    return o
end
 
function Account:deposit(v)
    self.balance = self.balance + v
end
 
function Account:withdraw(v)
    if v > self.balance then
        print('insufficient funds')
        return
    end
    self.balance = self.balance - v
end
 
-- 構(gòu)建 Account 對(duì)象,初始 balance 為 100
local a1 = Account:new{balance = 100}
a1:deposit(100)    --> balance == 200
a1:withdraw(100)   --> balance == 100
 
-- 構(gòu)建 Account 對(duì)象,使用默認(rèn)的 balance
local a2 = Account:new()
a2:deposit(100)    --> balance == 100

在方法定義時(shí)使用冒號(hào)能夠添加一個(gè)隱藏的參數(shù) self 給方法,在方法調(diào)用時(shí)使用冒號(hào)能夠?qū)⒄{(diào)用者作為一個(gè)額外的參數(shù)傳遞給此方法,例如:

復(fù)制代碼 代碼如下:

-- 以下兩種寫法等價(jià)
function Account:deposit(v)
function Account.deposit(self, v)
 
-- 以下兩種寫法等價(jià)
a1:deposit(100)
a1.deposit(a1, 100)

self 為方法的調(diào)用者。

在 Account 這個(gè)例子中,一個(gè)小優(yōu)化是,我們沒有必要?jiǎng)?chuàng)建一個(gè)額外的 metatable,而直接使用 Account 作為 metatable。

繼承

我們通過(guò)一個(gè)例子來(lái)解釋 Lua 如何實(shí)現(xiàn)繼承。假定我們需要子類 SpecialAccount 繼承于 Account,SpecialAccount 是可以透支的。

首先構(gòu)造一個(gè)子類:

復(fù)制代碼 代碼如下:

SpecialAccount = Account:new()

這里 SpecialAccount 擁有了(繼承了)Account 的 new 方法。那么我們就可以使用 SpecialAccount 構(gòu)建對(duì)象:
復(fù)制代碼 代碼如下:

local sa = SpecialAccount:new{limit = 1000}
sa:withdraw(100)

這里通過(guò) SpecialAccount:new 構(gòu)造了對(duì)象 sa,并且 sa 的 metatable 為 SpecialAccount。執(zhí)行 sa:withdraw(100),Lua 在 sa 中找不到 withdraw,就會(huì)在 SpecialAccount 中找,在 SpecialAccount 中也找不到 withdraw,然后在 Account 中找到 withdraw 并調(diào)用它。Account 中的 withdraw 顯然不是我們想要的,我們?cè)?SpecialAccount 中重新定義它:

復(fù)制代碼 代碼如下:

function SpecialAccount:withdraw(v)
    if v - self.balance >= self:getLimit() then
        print('insufficient funds')
        return
    end
    self.balance = self.balance - v
end
 
function SpecialAccount:getLimit()
    return self.limit or 0
end

我們?cè)僬{(diào)用 sa:withdraw(100),Lua 先在 SpecialAccount 中找到 withdraw 并調(diào)用它。

您可能感興趣的文章:
  • Lua腳本語(yǔ)言簡(jiǎn)明入門教程
  • Lua極簡(jiǎn)入門指南(一):基礎(chǔ)知識(shí)篇
  • Lua極簡(jiǎn)入門指南(三): loadfile和錯(cuò)誤處理
  • Lua極簡(jiǎn)入門指南(一):函數(shù)篇
  • Lua極簡(jiǎn)入門指南:全局變量
  • lua腳本語(yǔ)言快速入門教程
  • Lua入門學(xué)習(xí)筆記
  • Lua極簡(jiǎn)入門指南(六):模塊
  • Lua腳本語(yǔ)言基本語(yǔ)法快速入門教程
  • Lua語(yǔ)言新手簡(jiǎn)單入門教程

標(biāo)簽:德宏 金昌 天門 儋州 天門 濰坊 臺(tái)灣 宣城

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua 極簡(jiǎn)入門指南(七):面向?qū)ο缶幊獭罚疚年P(guān)鍵詞  Lua,極簡(jiǎn),入門,指南,七,面向,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua 極簡(jiǎn)入門指南(七):面向?qū)ο缶幊獭废嚓P(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Lua 極簡(jiǎn)入門指南(七):面向?qū)ο缶幊痰南嚓P(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    明光市| 金沙县| 湛江市| 冀州市| 永善县| 南靖县| 巧家县| 柘荣县| 读书| 伊宁市| 乌鲁木齐市| 赤峰市| 金秀| 裕民县| 北海市| 碌曲县| 黑山县| 韩城市| 调兵山市| 贵港市| 扎兰屯市| 同江市| 温宿县| 泰兴市| 葵青区| 五大连池市| 青冈县| 岳阳市| 阿克陶县| 东山县| 梧州市| 浙江省| 高州市| 丰台区| 光泽县| 电白县| 安福县| 新巴尔虎左旗| 怀仁县| 枣阳市| 泸州市|