Lua - 面向對象
面向對象編程介紹
你好,有志者們!今天,我們將踏上一段令人興奮的旅程,進入使用Lua進行的面向對象編程(OOP)的世界。別擔心如果你是編程新手;我會帶你一步步學習,用我在課堂上多年的關懷和熱情。
面向對象編程就像用樂高積木建造。每塊積木(或對象)都有自己的屬性和能夠執行的特定動作。當我們將它們組合起來時,就創造了令人驚艷的結構(或程序)!
面向對象的特點
在我們深入Lua之前,讓我們快速看一下OOP的主要特點:
- 封裝:這就像把你的玩具放在盒子里。盒子(對象)包含了所有相關的東西(數據和函數)。
- 繼承:想像你有一個機器人玩具。現在,你得到了一個新的機器人玩具,它能做舊的玩具能做的所有事情,還有一些新花招。這就是繼承!
- 多態:這就像有一個遙控器可以控制不同的設備。同一個按鈕,根據你控制的對象不同,會有不同的動作。
- 抽象:想像一下使用微波爐。你不需要知道它內部是如何工作的;你只需要知道要按哪些按鈕。
Lua中的OOP
現在,讓我們看看如何在Lua中使用這些OOP概念。Lua不像其他一些語言那樣有內置的類,但我們可以使用表格和函數來創建面向對象的結構。這就像我們從頭開始建造我們自己的樂高積木套件!
創建一個簡單的類
讓我們從創建一個簡單的類開始。在Lua中,我們使用表格來表示類。
local Dog = {}
Dog.__index = Dog
function Dog.new(name, age)
local self = setmetatable({}, Dog)
self.name = name
self.age = age
return self
end
function Dog:bark()
print(self.name .. " says: Woof!")
end
讓我們分解一下:
- 我們創建了一個名為
Dog
的表格。 - 我們設置
Dog.__index = Dog
。這是Lua的一點魔法,有助於繼承。 - 我們創建了一個
new
函數,作為我們的構造函數。它創建了一個帶有名稱和年齡的新狗。 - 我們為Dog類添加了一個
bark
方法。
創建一個對象
現在,我們有了Dog類,讓我們創建一個Dog對象:
local myDog = Dog.new("Buddy", 3)
恭喜你!你剛剛創建了你的第一個對象。myDog
現在是一個名為 "Buddy" 且年齡為3的Dog對象。
訪問屬性
我們可以像這樣訪問我們狗的屬性:
print(myDog.name) -- 輸出:Buddy
print(myDog.age) -- 輸出:3
這就像使用點語法一樣簡單!
訪問成員函數
要讓我們的狗叫,我們可以調用bark方法:
myDog:bark() -- 輸出:Buddy says: Woof!
注意使用的是冒號 :
而不是點。這是Lua傳遞 self
給方法的語法。
完整示例
讓我們把所有東西放在一起:
local Dog = {}
Dog.__index = Dog
function Dog.new(name, age)
local self = setmetatable({}, Dog)
self.name = name
self.age = age
return self
end
function Dog:bark()
print(self.name .. " says: Woof!")
end
local Labrador = {}
setmetatable(Labrador, {__index = Dog})
function Labrador.new(name, age, color)
local self = Dog.new(name, age)
setmetatable(self, {__index = Labrador})
self.color = color
return self
end
function Labrador:swim()
print(self.name .. " is swimming!")
end
這裡,我們創建了一個Labrador類,它從Dog類繼承。它具有Dog的所有屬性和方法,以及一個新的屬性(顏色)和一個新的方法(游泳)。
覆蓋基類函數
我們也可以覆蓋基類的函數。讓我們給我們的Labrador一個特殊的叫聲:
function Labrador:bark()
print(self.name .. " says: Woof woof woof!")
end
現在,當一個Labrador叫時,它會與一個普通的Dog不同。
繼承完整示例
讓我們把所有東西放在一起:
local Dog = {}
Dog.__index = Dog
function Dog.new(name, age)
local self = setmetatable({}, Dog)
self.name = name
self.age = age
return self
end
function Dog:bark()
print(self.name .. " says: Woof!")
end
local Labrador = {}
setmetatable(Labrador, {__index = Dog})
function Labrador.new(name, age, color)
local self = Dog.new(name, age)
setmetatable(self, {__index = Labrador})
self.color = color
return self
end
function Labrador:swim()
print(self.name .. " is swimming!")
end
function Labrador:bark()
print(self.name .. " says: Woof woof woof!")
end
local myDog = Dog.new("Buddy", 3)
local myLabrador = Labrador.new("Max", 2, "Yellow")
myDog:bark() -- 輸出:Buddy says: Woof!
myLabrador:bark() -- 輸出:Max says: Woof woof woof!
myLabrador:swim() -- 輸出:Max is swimming!
這就是全部!我們創建了一個基本的類結構,實現了繼承,甚至覆蓋了方法。你已經走上了成為Lua OOP專家的道路!
記住,熟能生巧。嘗試創建你自己的類並嘗試不同的屬性和方法。祝你編程愉快!
Credits: Image by storyset