# Lua 面向對象
面向對象編程(Object Oriented Programming,OOP)是一種非常流行的計算機編程架構。
以下幾種編程語言都支持面向對象編程:
- C++
- Java
- Objective-C
- Smalltalk
- C#
- Ruby
### 面向對象特征
- 1) 封裝:指能夠把一個實體的信息、功能、響應都裝入一個單獨的對象中的特性。
- 2) 繼承:繼承的方法允許在不改動原程序的基礎上對其進行擴充,這樣使得原功能得以保存,而新功能也得以擴展。這有利于減少重復編碼,提高軟件的開發效率。
- 3) 多態:同一操作作用于不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。
- 4)抽象:抽象(Abstraction)是簡化復雜的現實問題的途徑,它可以為具體問題找到最恰當的類定義,并且可以在最恰當的繼承級別解釋問題。
### Lua 中面向對象
我們知道,對象由屬性和方法組成。LUA中最基本的結構是table,所以需要用table來描述對象的屬性。
lua中的function可以用來表示方法。那么LUA中的類可以通過table + function模擬出來。
至于繼承,可以通過metetable模擬出來(不推薦用,只模擬最基本的對象大部分時間夠用了)。
Lua中的表不僅在某種意義上是一種對象。像對象一樣,表也有狀態(成員變量);也有與對象的值獨立的本性,特別是擁有兩個不同值的對象(table)代表兩個不同的對象;一個對象在不同的時候也可以有不同的值,但他始終是一個對象;與對象類似,表的生命周期與其由什么創建、在哪創建沒有關系。對象有他們的成員函數,表也有:
~~~
~~~
Account?=?{balance?=?0}
function?Account.withdraw?(v)
????Account.balance?=?Account.balance?-?v
end
~~~
~~~
這個定義創建了一個新的函數,并且保存在Account對象的withdraw域內,下面我們可以這樣調用:
~~~
~~~
Account.withdraw(100.00)
~~~
~~~
### 一個簡單實例
以下簡單的類包含了三個屬性: area, length 和 breadth,printArea方法用于打印計算結果:
~~~
~~~
--?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
~~~
~~~
### 創建對象
創建對象是位類的實例分配內存的過程。每個類都有屬于自己的內存并共享公共數據。
~~~
~~~
r?=?Rectangle:new(nil,10,20)
~~~
~~~
### 訪問屬性
我們可以使用點號(.)來訪問類的屬性:
~~~
~~~
print(r.length)
~~~
~~~
### 訪問成員函數
我們可以使用冒號(:)來訪問類的屬性:
~~~
~~~
r:printArea()
~~~
~~~
內存在對象初始化時分配。
### 完整實例
以下我們演示了 Lua 面向對象的完整實例:
~~~
~~~
--?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,10)
myshape:printArea()
~~~
~~~
執行以上程序,輸出結果為:
~~~
~~~
面積為?????100
~~~
~~~
### Lua 繼承
繼承是指一個對象直接使用另一對象的屬性和方法。可用于擴展基礎類的屬性和方法。
以下演示了一個簡單的繼承實例:
~~~
~~~
?--?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
~~~
~~~
接下來的實例,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
~~~
~~~
### 完整實例
以下實例我們繼承了一個簡單的類,來擴展派生類的方法,派生類中保留了繼承類的成員變量和方法:
~~~
~~~
?--?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,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
--?創建對象
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
--?創建對象
myrectangle?=?Rectangle:new(nil,10,20)
myrectangle:printArea()
~~~
~~~
執行以上代碼,輸出結果為:
~~~
~~~
面積為?????100
正方形面積為??100
矩形面積為???200
~~~
~~~
### 函數重寫
Lua 中我們可以重寫基礎類的函數,在派生類中定義自己的實現方式:
~~~
~~~
--?派生類方法?printArea
function?Square:printArea?()
??print("正方形面積?",self.area)
end
~~~
~~~
- Lua 簡介
- Lua 環境安裝
- Lua 數據類型
- Lua 變量
- Lua 循環
- Lua while 循環
- Lua for 循環
- Lua repeat...until 循環
- Lua 循環嵌套
- Lua break 語句
- Lua 流程控制
- Lua if 語句
- Lua if...else 語句
- Lua if 嵌套語句
- Lua 函數
- Lua 運算符
- Lua 字符串
- Lua 數組
- Lua 迭代器
- Lua table(表)
- Lua 模塊與包
- Lua 元表(Metatable)
- Lua 協同程序(coroutine)
- Lua 文件 I/O
- Lua 錯誤處理
- Lua 調試(Debug)
- Lua 垃圾回收
- Lua 面向對象
- Lua 數據庫訪問
- CoverPage