找回密码
马上加入

QQ登录

只需一步,快速开始

搜索
发新帖

0

收听

0

听众

133

主题

Lua 面向对象编程示例

IP属地:局域网
发表于 2024-6-20 16:12:21 | 查看: 111| 回复: 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 中实现面向对象编程,包括类定义、继承和方法调用等基本概念。

发表于 2024-6-20 17:08:58 IP属地:局域网
太难了  完全看不懂
您需要登录后才可以回帖 登录 | 马上加入

QQ|Archiver|手机版|小黑屋|alg阿灵戈社区 ( 苏ICP备2023026137号-1|苏ICP备2023026137号-1 )

GMT+8, 2025-3-13 04:22 , Processed in 0.652566 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表