Lua - 面向對象

面向對象編程介紹

你好,有志者們!今天,我們將踏上一段令人興奮的旅程,進入使用Lua進行的面向對象編程(OOP)的世界。別擔心如果你是編程新手;我會帶你一步步學習,用我在課堂上多年的關懷和熱情。

Lua - Object Oriented

面向對象編程就像用樂高積木建造。每塊積木(或對象)都有自己的屬性和能夠執行的特定動作。當我們將它們組合起來時,就創造了令人驚艷的結構(或程序)!

面向對象的特點

在我們深入Lua之前,讓我們快速看一下OOP的主要特點:

  1. 封裝:這就像把你的玩具放在盒子里。盒子(對象)包含了所有相關的東西(數據和函數)。
  2. 繼承:想像你有一個機器人玩具。現在,你得到了一個新的機器人玩具,它能做舊的玩具能做的所有事情,還有一些新花招。這就是繼承!
  3. 多態:這就像有一個遙控器可以控制不同的設備。同一個按鈕,根據你控制的對象不同,會有不同的動作。
  4. 抽象:想像一下使用微波爐。你不需要知道它內部是如何工作的;你只需要知道要按哪些按鈕。

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

讓我們分解一下:

  1. 我們創建了一個名為 Dog 的表格。
  2. 我們設置 Dog.__index = Dog。這是Lua的一點魔法,有助於繼承。
  3. 我們創建了一個 new 函數,作為我們的構造函數。它創建了一個帶有名稱和年齡的新狗。
  4. 我們為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