Lua - 面向对象编程

面向对象编程简介

你好,有抱负的程序员们!今天,我们将踏上一段令人兴奋的旅程,探索使用Lua进行面向对象编程(OOP)的世界。如果你是编程新手,不用担心;我会像在课堂上多年来使用的同样的细心和热情,引导你完成每一步。

Lua - Object Oriented

面向对象编程就像用乐高积木搭建。每一块积木(或对象)都有其自己的属性,并能做一些特定的事情。当我们把它们组合在一起时,就创造了惊人的结构(或程序)!

面向对象编程的主要特性

在我们深入研究Lua之前,让我们快速了解一下OOP的主要特性:

  1. 封装:这就像把你的玩具放在盒子里。盒子(对象)包含了所有相关的东西(数据和函数)。
  2. 继承:想象你有一个机器人玩具。现在,你得到了一个新的机器人玩具,它能做旧的那个机器人能做的一切,还有一些新把戏。这就是继承!
  3. 多态:这就好比有一个遥控器可以控制不同的设备。同一个按钮,根据你控制的东西不同,会有不同的动作。
  4. 抽象:想象使用微波炉。你不需要知道它内部是如何工作的;你只需要知道该按哪些按钮。

Lua中的面向对象编程

现在,让我们看看如何在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 myDog = Dog.new("Buddy", 3)
print(myDog.name) -- 输出: Buddy
print(myDog.age)  -- 输出: 3
myDog:bark()      -- 输出: Buddy says: Woof!

Lua中的继承

现在,让我们拿我们的Dog类,创建一个更具体的狗类型 - 拉布拉多。这就是继承派上用场的地方。

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的所有属性和方法,加上一个新的属性(颜色)和一个新方法(游泳)。

重写基类函数

我们还可以覆盖基类中的函数。让我们给我们的拉布拉多一个特殊的叫声:

function Labrador:bark()
print(self.name .. " says: Woof woof woof!")
end

现在,当一个拉布拉多叫时,它的叫声会与普通狗不同。

继承完整示例

让我们把所有东西放在一起:

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