Lua 面向对象


Lua 从 5.0 版本开始支持面向对象编程(OOP)。在 Lua 中,我们可以通过创建类、实例化对象、定义属性和方法的方式实现面向对象的编程能力。

创建类

在 Lua 中,我们可以通过创建表(table)来定义一个类。表中包含了类的属性和方法。我们需要定义一个类的构造函数来初始化类。

-- 定义一个Person类
Person = {name="", age=0}

-- 定义Person类的构造函数
function Person:new(name, age)
    local obj = {}
    setmetatable(obj, self)
    self.__index = self
    obj.name = name
    obj.age = age
    return obj
end

上面的代码中,我们首先定义了一个名为 Person 的类。然后通过定义 new 函数作为构造函数来初始化类。在 new 函数中,我们首先创建一个空的表 obj 作为类的实例。然后我们用当前类作为 obj 的元表并将实例对象的索引属性 __index 定义为 self。最后我们设置实例的基本属性 nameage 并返回实例对象。

实例化对象

使用类的构造函数来创建一个实例。可以直接调用类的构造函数,也可以通过 : 运算符将构造函数绑定到类的实例上来创建实例。

-- 直接调用构造函数创建实例
local person1 = Person:new("Alice", 20)

-- 将构造函数绑定到类的实例上,通过调用实例的方法创建对象
local person2 = {}
Person:new(person2, "Bob", 25)

上面的例子中,我们创建了两个不同的 Person 类的实例 person1person2。两种方法都可以创建实例,但是使用 : 运算符将构造函数绑定到实例对象上通常更加方便。

定义属性和方法

类的属性和方法可以通过直接为类添加表项来定义。属性可以直接在类表中定义;方法可以定义成一个函数,也可以定义成一个函数表。

-- 添加属性和方法到Person类
Person.gender = "female" -- 添加属性gender

function Person:greet() -- 定义方法greet
    print("Hello, my name is " .. self.name .. ", I am " .. self.age .. " years old!")
end

function Person:say(str) -- 定义方法say
    print(str)
end

上面的代码中,我们给 Person 类添加了一个属性 gender 和三个方法 greetsaynew。注意到,在定义 greetsay 方法时,我们使用了冒号运算符 :,这是因为这两个方法需要使用 self 作为参数来访问类的实例的属性。

使用对象

使用对象或者其属性和方法时,除了可以使用点运算符 .``访问属性或方法外,还可以使用冒号运算符 :` 访问。

-- 通过点运算符访问属性和方法
print(person1.name)
person1:greet()

-- 通过冒号运算符访问属性和方法
print(person2.gender)
person2:say("I am a man.")

上面的代码中,我们分别展示了使用点运算符和冒号运算符访问类对象或者实例对象的属性和方法。

总结

本文介绍了在 Lua 中如何实现面向对象编程。我们首先介绍了如何定义一个类,然后展示了如何通过类的构造函数创建对象实例。接下来我们讲解了如何定义类的属性和方法,最后我们展示了如何使用对象或其属性和方法。