麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

Lua 極簡入門指南(七):面向對象編程

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

在很多面向對象的語言中有類(class)的概念,對象是類的實例。Lua 中不存在類的概念。Lua 就像 JavaScript 一樣是面向原型的語言(http://en.wikipedia.org/wiki/Prototype-based_programming),這類語言使用一個對象表示一個“類”,其他對象(此類的實例)使用此對象作為原型。我們有兩個 table p 和 obj,將 p 設置為 obj 的原型

復制代碼 代碼如下:

setmetatable(obj, {__index = p})

 

obj 中不存在的操作會在 p 中查找。

看一個詳細的例子:

復制代碼 代碼如下:

Account = {
    -- 默認的 balance 的值
    balance = 0
}
 
function Account:new(o)
    o = o or {}
    -- 設置原型為 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
 
-- 構建 Account 對象,初始 balance 為 100
local a1 = Account:new{balance = 100}
a1:deposit(100)    --> balance == 200
a1:withdraw(100)   --> balance == 100
 
-- 構建 Account 對象,使用默認的 balance
local a2 = Account:new()
a2:deposit(100)    --> balance == 100

 

在方法定義時使用冒號能夠添加一個隱藏的參數 self 給方法,在方法調用時使用冒號能夠將調用者作為一個額外的參數傳遞給此方法,例如:

復制代碼 代碼如下:

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

 

self 為方法的調用者。

在 Account 這個例子中,一個小優化是,我們沒有必要創建一個額外的 metatable,而直接使用 Account 作為 metatable。

繼承

我們通過一個例子來解釋 Lua 如何實現繼承。假定我們需要子類 SpecialAccount 繼承于 Account,SpecialAccount 是可以透支的。

首先構造一個子類:

復制代碼 代碼如下:

SpecialAccount = Account:new()

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

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

 

這里通過 SpecialAccount:new 構造了對象 sa,并且 sa 的 metatable 為 SpecialAccount。執行 sa:withdraw(100),Lua 在 sa 中找不到 withdraw,就會在 SpecialAccount 中找,在 SpecialAccount 中也找不到 withdraw,然后在 Account 中找到 withdraw 并調用它。Account 中的 withdraw 顯然不是我們想要的,我們在 SpecialAccount 中重新定義它:

復制代碼 代碼如下:

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

 

我們再調用 sa:withdraw(100),Lua 先在 SpecialAccount 中找到 withdraw 并調用它。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久久国产一区二区三区 | 操碰 | 国产精品久久久久久久久久久天堂 | 最近中文字幕一区二区 | 福利在线免费 | 亚洲成人激情av | 免费人成在线播放 | 国产精品久久久久久久久久久久久久久久 | 国产99页 | 欧美a∨一区二区三区久久黄 | 欧美成人做爰高潮片免费视频 | 欧美18—19sex性hd按摩 | 国产在线精品一区二区三区 | 免费性爱视频 | 欧美在线a| 国产精品久久在线观看 | 玖草| 91在线播放国产 | 天天躁狠狠躁夜躁2020挡不住 | 久久久久免费精品 | 国产精品一区在线观看 | 日韩欧美视频一区二区三区 | 人人舔人人舔 | 国产亚洲精品成人a | 日韩精品久久久久久 | 他也色在线视频 | 日韩精品无码一区二区三区 | 91av久久| 免费三级大片 | 91av在线免费播放 | 成人男女免费视频 | 欧美一级高潮 | 黄色片免费看网站 | 久久久综合视频 | 日本黄色一级视频 | 日本中文字幕网址 | 视频一区二区三区免费观看 | 午夜视频大全 | av电影直播| 水卜樱一区二区av | 男人天堂免费 |