|
发表于 2024-6-20 16:12:21
|
查看: 109 |
回复: 1
### Lua 面向对象编程示例
-- 定义一个类
Person = {}
Person.__index = Person
-- 构造函数
function Person:new(name, age)
local self = setmetatable({}, Person)
self.name = name or "Unknown"
self.age = age or 0
return self
end
-- 类的方法
function Person:display()
print("Name: " .. self.name .. ", Age: " .. self.age)
end
-- 创建一个实例
local person1 = Person:new("Alice", 30)
person1:display()
-- 定义一个子类
Student = setmetatable({}, {__index = Person})
Student.__index = Student
-- 子类的构造函数
function Student:new(name, age, grade)
local self = Person.new(self, name, age) -- 调用父类的构造函数
self.grade = grade or "None"
return self
end
-- 子类的方法
function Student:display()
Person.display(self) -- 调用父类的方法
print("Grade: " .. self.grade)
end
-- 创建子类的实例
local student1 = Student:new("Bob", 20, "A")
student1:display()
```
### 代码解释
1. **定义一个类**:
- `Person = {}` 定义一个空表来表示类。
- `Person.__index = Person` 设置元表的 `__index` 元方法指向类本身,使其可以使用 `:` 语法调用方法。
2. **构造函数**:
- `function Person:new(name, age)` 定义构造函数,使用 `setmetatable` 创建一个新的表,并将其元表设置为 `Person`,从而实现类的实例化。
- `self.name` 和 `self.age` 初始化实例的属性。
3. **类的方法**:
- `function Person:display()` 定义一个方法,用于显示实例的属性。
4. **创建实例**:
- `local person1 = Person:new("Alice", 30)` 创建 `Person` 类的实例。
- `person1:display()` 调用实例的方法。
5. **定义一个子类**:
- `Student = setmetatable({}, {__index = Person})` 使用 `setmetatable` 创建子类,并将其元表的 `__index` 设置为 `Person`,实现继承。
- `Student.__index = Student` 设置子类的 `__index` 为子类本身。
6. **子类的构造函数**:
- `function Student:new(name, age, grade)` 定义子类的构造函数。
- `Person.new(self, name, age)` 调用父类的构造函数来初始化继承的属性。
7. **子类的方法**:
- `function Student:display()` 重写父类的方法,同时调用父类的方法显示继承的属性,并显示子类特有的属性 `grade`。
8. **创建子类的实例**:
- `local student1 = Student:new("Bob", 20, "A")` 创建 `Student` 类的实例。
- `student1:display()` 调用实例的方法。
通过以上代码,我们展示了如何在 Lua 中实现面向对象编程,包括类定义、继承和方法调用等基本概念。
|
|