面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP)是一種非常流行的計算機(jī)編程架構(gòu)。
以下幾種編程語言都支持面向?qū)ο缶幊蹋?/p>
我們知道,對象由屬性和方法組成。LUA中最基本的結(jié)構(gòu)是table,所以需要用table來描述對象的屬性。
lua中的function可以用來表示方法。那么LUA中的類可以通過table + function模擬出來。
至于繼承,可以通過metetable模擬出來(不推薦用,只模擬最基本的對象大部分時間夠用了)。
Lua中的表不僅在某種意義上是一種對象。像對象一樣,表也有狀態(tài)(成員變量);也有與對象的值獨(dú)立的本性,特別是擁有兩個不同值的對象(table)代表兩個不同的對象;一個對象在不同的時候也可以有不同的值,但他始終是一個對象;與對象類似,表的生命周期與其由什么創(chuàng)建、在哪創(chuàng)建沒有關(guān)系。對象有他們的成員函數(shù),表也有:
Account = {balance = 0} function Account.withdraw (v) Account.balance = Account.balance - v end
這個定義創(chuàng)建了一個新的函數(shù),并且保存在Account對象的withdraw域內(nèi),下面我們可以這樣調(diào)用:
Account.withdraw(100.00)
以下簡單的類包含了三個屬性: area, length 和 breadth,printArea方法用于打印計算結(jié)果:
-- Meta class Rectangle = {area = 0, length = 0, breadth = 0} -- 派生類的方法 new function Rectangle:new (o,length,breadth) o = o or {} setmetatable(o, self) self.__index = self self.length = length or 0 self.breadth = breadth or 0 self.area = length*breadth; return o end -- 派生類的方法 printArea function Rectangle:printArea () print("矩形面積為 ",self.area) end
創(chuàng)建對象是位類的實例分配內(nèi)存的過程。每個類都有屬于自己的內(nèi)存并共享公共數(shù)據(jù)。
r = Rectangle:new(nil,10,20)
我們可以使用點(diǎn)號(.)來訪問類的屬性:
print(r.length)
我們可以使用冒號(:)來訪問類的屬性:
r:printArea()
內(nèi)存在對象初始化時分配。
以下我們演示了 Lua 面向?qū)ο蟮耐暾麑嵗?/p>
-- Meta class Shape = {area = 0} -- 基礎(chǔ)類方法 new function Shape:new (o,side) o = o or {} setmetatable(o, self) self.__index = self side = side or 0 self.area = side*side; return o end -- 基礎(chǔ)類方法 printArea function Shape:printArea () print("面積為 ",self.area) end -- 創(chuàng)建對象 myshape = Shape:new(nil,10) myshape:printArea()
執(zhí)行以上程序,輸出結(jié)果為:
面積為 100
繼承是指一個對象直接使用另一對象的屬性和方法??捎糜跀U(kuò)展基礎(chǔ)類的屬性和方法。
以下演示了一個簡單的繼承實例:
-- Meta class Shape = {area = 0} -- 基礎(chǔ)類方法 new function Shape:new (o,side) o = o or {} setmetatable(o, self) self.__index = self side = side or 0 self.area = side*side; return o end -- 基礎(chǔ)類方法 printArea function Shape:printArea () print("面積為 ",self.area) end
接下來的實例,Square 對象繼承了 Shape 類:
Square = Shape:new() -- Derived class method new function Square:new (o,side) o = o or Shape:new(o,side) setmetatable(o, self) self.__index = self return o end
以下實例我們繼承了一個簡單的類,來擴(kuò)展派生類的方法,派生類中保留了繼承類的成員變量和方法:
-- Meta class Shape = {area = 0} -- 基礎(chǔ)類方法 new function Shape:new (o,side) o = o or {} setmetatable(o, self) self.__index = self side = side or 0 self.area = side*side; return o end -- 基礎(chǔ)類方法 printArea function Shape:printArea () print("面積為 ",self.area) end -- 創(chuàng)建對象 myshape = Shape:new(nil,10) myshape:printArea() Square = Shape:new() -- 派生類方法 new function Square:new (o,side) o = o or Shape:new(o,side) setmetatable(o, self) self.__index = self return o end -- 派生類方法 printArea function Square:printArea () print("正方形面積為 ",self.area) end -- 創(chuàng)建對象 mysquare = Square:new(nil,10) mysquare:printArea() Rectangle = Shape:new() -- 派生類方法 new function Rectangle:new (o,length,breadth) o = o or Shape:new(o) setmetatable(o, self) self.__index = self self.area = length * breadth return o end -- 派生類方法 printArea function Rectangle:printArea () print("矩形面積為 ",self.area) end -- 創(chuàng)建對象 myrectangle = Rectangle:new(nil,10,20) myrectangle:printArea()
執(zhí)行以上代碼,輸出結(jié)果為:
面積為 100 正方形面積為 100 矩形面積為 200
Lua 中我們可以重寫基礎(chǔ)類的函數(shù),在派生類中定義自己的實現(xiàn)方式:
-- 派生類方法 printArea function Square:printArea () print("正方形面積 ",self.area) end
更多建議: