Lua 面向對象
面向對象特征
1) 封裝:指能夠把一個實體的信息、功能、響應都裝入一個單獨的對象中的特性。
2) 繼承:繼承的方法允許在不改動原程序的基礎上對其進行擴充,這樣使得原功能得以保存,而新功能也得以擴展。這有利於減少重復編碼,提高軟件的開發效率。
3) 多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。
4)抽象:抽象(Abstraction)是簡化復雜的現實問題的途徑,它可以為具體問題找到最恰當的類定義,並且可以在最恰當的繼承級別解釋問題。
Lua 中面向對象
我們知道,對象由屬性和方法組成。LUA中最基本的結構是table,所以需要用table來描述對象的屬性。
lua中的function可以用來表示方法。那麽LUA中的類可以通過table + function模擬出來。
至於繼承,可以通過metetable模擬出來(不推薦用,只模擬最基本的對象大部分時間夠用了)。
Lua中的表不僅在某種意義上是一種對象。像對象一樣,表也有狀態(成員變量);也有與對象的值獨立的本性,特別是擁有兩個不同值的對象(table)代表兩個不同的對象;一個對象在不同的時候也可以有不同的值,但他始終是一個對象;與對象類似,表的生命周期與其由什麽創建、在哪創建沒有關系。對象有他們的成員函數,表也有。
創建對象是位類的實例分配內存的過程。每個類都有屬於自己的內存並共享公共數據。
訪問屬性
我們可以使用點號(.)來訪問類的屬性:
print(r.length)
訪問成員函數
我們可以使用冒號 : 來訪問類的成員函數:
r:printArea()
內存在對象初始化時分配。
Shape = {area = 0} -- 基礎類方法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 -- 基礎類方法 printArea function Shape:printArea() print("面積為 : ",self.area) end --創建對象 myshape = Shape:new(nil,12) myshape:printArea()
運行結果:
繼承了一個簡單的類,來擴展派生類的方法,派生類中保留了繼承類的成員變量和方法:
-- Meta class Shape = {area = 0} -- 基礎類方法 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 -- 基礎類方法 printArea function Shape:printArea () print("面積為 :",self.area) end -- 創建對象 myshape = Shape:new(nil,12) 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 -- 創建對象 mysquare = Square:new(nil,15) 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 -- 創建對象 myrectangle = Rectangle:new(nil,18,22) myrectangle:printArea()
運行結果:
本文出自 “享受科技帶來的快樂” 博客,請務必保留此出處http://liam2199.blog.51cto.com/2879872/1962043
Lua 面向對象