Lua - 面向对象编程
面向对象编程简介
你好,有抱负的程序员们!今天,我们将踏上一段令人兴奋的旅程,探索使用Lua进行面向对象编程(OOP)的世界。如果你是编程新手,不用担心;我会像在课堂上多年来使用的同样的细心和热情,引导你完成每一步。
面向对象编程就像用乐高积木搭建。每一块积木(或对象)都有其自己的属性,并能做一些特定的事情。当我们把它们组合在一起时,就创造了惊人的结构(或程序)!
面向对象编程的主要特性
在我们深入研究Lua之前,让我们快速了解一下OOP的主要特性:
- 封装:这就像把你的玩具放在盒子里。盒子(对象)包含了所有相关的东西(数据和函数)。
- 继承:想象你有一个机器人玩具。现在,你得到了一个新的机器人玩具,它能做旧的那个机器人能做的一切,还有一些新把戏。这就是继承!
- 多态:这就好比有一个遥控器可以控制不同的设备。同一个按钮,根据你控制的东西不同,会有不同的动作。
- 抽象:想象使用微波炉。你不需要知道它内部是如何工作的;你只需要知道该按哪些按钮。
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
让我们分解一下:
- 我们创建了一个名为
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 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