lua 物件導向程式設計

2021-09-07 06:20:01 字數 2222 閱讀 6146

物件的實現

在lua中table就是一種物件

1.有自己的狀態

2.有自己的唯一標識self

3.有自己的生命週期

使用table可以自己實現物件導向的幾乎所有特性

把函式定義在table中,並使用t.func的形式訪問,如同方法呼叫

account =

function account.withdraw(v)

account.balance = account.ballance - v

end但在函式中使用全域性的account是乙個不好的習慣

在lua中使用物件導向方式程式設計時盡量使用self和t:func的形式    

帶有標識自身物件的方法定義:

function account.withdraw(self, v)

同上的語法糖定義:

function account:withdraw(v)

帶有標識自身物件的方法呼叫:

a1.withdraw(a1, v)

同上的語法糖定義:

a1:withdraw(v)

使用":"會把自身當做每乙個引數隱式的傳入

使用self是物件導向程式設計的一大核心,很多語言為程式設計師隱藏了這個引數

self在c++中就相當於this指標

類的實現

在lua中沒有類的概念,但可以自己來實現

function account:new(o)

o = o or {} --如果使用者沒有提供table,則建立乙個

setmetatable(o, self)

self.__index = self

return o

end當使用new函式來建立物件後(其實就是建立乙個新的table),所有的訪問都會從account這個table裡找

這種情況就相當於account是乙個類,也可以說是乙個原型模具,所有新建立的table都擁有他的屬性和方法

a = account:new

a:deposit(100.00)

由於deposit在新建立的table a裡沒有定義

因此通過它的元表__index來查詢,a的元表是account,

因此會呼叫account的deposit方法,但self傳入的是a

這就實現了a繼承了account的方法deposit

在這裡也看到了使用self來標識呼叫物件的好處

繼承和派生

sa = account:new()

s = sa:new

第一行sa繼承了account,sa的元表是account,找不到的方法就去account裡去找

第二行s繼承了sa,這裡的new是account的方法但傳入的self是sa,

致使s的元表是sa而sa的元表又是account

所以一層一層的繼承了下去,並且在每一層的派生table裡都可以定義過載方法和新的方法

在lua裡的可以實現多重繼承,就是使元表的__index指向乙個函式,然後自行判斷並處理

私密性

使用table來實現物件導向的程式設計方式,幾乎可以實現所有物件導向的程式設計特性

但它沒有也不想去實現的就是物件的私密性,也就是c++裡的private、public、protected

這與lua設計的初衷有關,lua定位於小型的程式開發,參與乙個工程的人不會很多,自行約束

非要實現私密性的話lua也不是不能,只是不能再使用table和元表的方式了

可以使用函式閉包來實現私密性:

function newaccount(init)

local self =

local withdraw = function(v)

self.balance = self.balance - v

endlocal deposit = function(v)

self.balance = self.balance + v

endreturn

end在閉包裡定義乙個table的upvalue,然後把所有閉包函式都定義在這裡table裡,

然後返回這個table,用key訪問內部方法

使用閉包實現物件的方式比用table效率高並實現了絕對的私密性,但無法實現繼承,相當於簡單的小物件

甚至可以在閉包裡僅定義乙個方法,然後通過key來判斷呼叫是什麼方法

tcl/tk對它的視窗部件就使用這種方法

LUA物件導向程式設計(二)繼承

在lua中模擬類的繼承行為,可以通過setmetatable方法來實現。首先,我們就先實現乙個基類vehicle,然後再定義該基類的乙個子類bicycle,基類的定義與之前介紹的類的定義方法是一致的,如果你對此還不是很熟悉,可以先回顧一下 lua物件導向程式設計 一 類 基類vehicle的定義 類...

lua物件導向

直接貼 參考的也是別人的,只不過其中幾點,增加一點自己的理解 local baseclass print baseclass是 tostring baseclass 定義index屬性,指向本身 baseclass.index baseclass 定義建構函式 function baseclass ...

Lua 物件導向

記錄學習過程 建立日期 2019 04 14 物件由屬性和方法組成。lua中最基本的結構是table,所以需要用table來描述物件的屬性。lua 中的 function 可以用來表示方法。那麼lua中的類可以通過 table function 模擬出來。乙個簡單的物件導向例子 屬性 person ...