Lua 面向對象
面向對象編程(Object Oriented Programming,OOP)是一種非常流行的計算機編程架構,通過創建和操作對象來設計應用程序。
以下幾種編程語言都支持面向對象編程:
- C++
- Java
- Objective-C
- Smalltalk
- C#
- Ruby
Lua 是一種輕量級的腳本語言,雖然它不像 Java 或 C++ 那樣內置強大的面向對象(OO)特性,但它非常靈活,可以通過一些技巧實現面向對象編程。
面向對象特征
-
封裝:將數據和方法捆綁在一起,隱藏實現細節,只暴露必要的接口,提高安全性和可維護性。
-
繼承:通過派生新類復用和擴展現有代碼,減少重復編碼,提高開發效率和可擴展性。
-
多態:同一操作作用于不同對象時表現不同,支持統一接口調用,增強靈活性和擴展性。
-
抽象:簡化復雜問題,定義核心類和接口,隱藏不必要的細節,便于管理復雜性。
Lua 中面向對象
我們知道,對象由屬性和方法組成。
Lua 中的類可以通過?table + function?模擬出來。
至于繼承,可以通過 metetable 模擬出來(不推薦用,只模擬最基本的對象大部分實現夠用了)。
在 Lua 中,最基本的結構是 table,我們可以使用表(table)來創建對象。
ClassName = {} -- 創建一個表作為類
通過 new 方法(或其他名稱)創建對象,并初始化對象的屬性。
function ClassName:new(...)local obj = {} -- 創建一個新的空表作為對象setmetatable(obj, self) -- 設置元表,使對象繼承類的方法self.__index = self -- 設置索引元方法-- 初始化對象的屬性obj:init(...) -- 可選:調用初始化函數return obj
end
表(table)是 Lua 中最基本的復合數據類型,可以用來表示對象的屬性。
Lua 中的 function 可以用來表示方法:
function ClassName:sayHello()print("Hello, my name is " .. self.name)
end
?使用 new 方法來創建對象,并通過對象調用類的方法。
local obj = ClassName:new("Alice") -- 創建對象
obj:sayHello() -- 調用對象的方法
-- 定義 Person 類
Person = {name = "", age = 0}-- Person 的構造函數
function Person:new(name, age)local obj = {} -- 創建一個新的表作為對象setmetatable(obj, self) -- 設置元表,使其成為 Person 的實例self.__index = self -- 設置索引元方法,指向 Personobj.name = nameobj.age = agereturn obj
end-- 添加方法:打印個人信息
function Person:introduce()print("My name is " .. self.name .. " and I am " .. self.age .. " years old.")
end
代碼說明:
- Person?是一個表,它有兩個屬性:name 和 age,這兩個屬性是類的默認屬性。
- Person:new(name, age)?是一個構造函數,用來創建新的 Person 對象。
- local obj = {}?創建一個新的表作為對象,setmetatable(obj, self) 設置元表,使得該表成為 Person 類的實例。
- self.__index = self?設置索引元方法,使得 obj 可以訪問 Person 類的屬性和方法。
- introduce?是 Person 類的方法,打印該 Person 對象的名字和年齡。
調用方法:
-- 創建一個 Person 對象
local person1 = Person:new("Alice", 30)-- 調用對象的方法
person1:introduce() -- 輸出 "My name is Alice and I am 30 years old."