找回密码
 立即注册
    查看: 216|回复: 2

    【浮生梦】Lua 第七课 Lua四特性 抽象、封装、继承、多态

    [复制链接]

    330

    主题

    66

    回帖

    1480

    积分

    积分
    1480
    发表于 2025-5-13 15:25:12 | 显示全部楼层 |阅读模式

    课程入口

    这节课程深入讲解了Lua中面向对象编程(OOP)的四大核心特性:抽象、封装、继承、多态,尽管Lua本身是面向过程的语言,但通过tablemetatable可以模拟OOP的特性。以下是核心内容总结:


    1. 抽象(Abstraction)

    • 定义:将复杂问题简化,只暴露必要的接口。
    • 示例:提取对象的主谓宾结构(如"张三跑步"抽象为Person:run())。
    • 关键点:隐藏细节,聚焦核心功能。

    2. 封装(Encapsulation)

    • 定义:将属性和方法打包,控制访问权限。
    • 实现方式
      • 闭包:通过局部变量和函数返回表,保护内部数据。
      • 示例
        function createPerson(name)
            local t = { name = name }
            function t:getName() return self.name end
            return t
        end
        
    • 作用:数据安全,模块化代码。

    3. 继承(Inheritance)

    • 定义:子类复用父类的属性和方法。

    • 实现步骤

      1. 父类构造:设置__index指向自身以实现继承链。
      Father = {}
      Father.__index = Father
      function Father:new(name)
          local t = { name = name }
          setmetatable(t, self)
          return t
      end
      
      1. 子类继承:通过setmetatable链接父类。
      Son = {}
      setmetatable(Son, Father)
      Son.__index = Son
      
    • 关键点:子类可覆盖父类方法(如Son:run()重写Father:run())。


    4. 多态(Polymorphism)

    • 定义:同一接口在不同子类中有不同实现。
    • 示例
      function Father:speak() print("Father speaks") end
      function Son:speak() print("Son speaks") end
      local obj = Son:new()
      obj:speak() -- 输出 "Son speaks"
      
    • 作用:增强代码灵活性,支持不同对象的行为差异化。

    关键细节

    • 冒号(:) vs 点(.)
      • 冒号隐式传递self(面向对象风格),点需显式传参。
      • 示例:
        t.run(self)  -- 等价于 t:run()
        
    • __index元方法:控制表中不存在的键的查找行为,是继承的核心机制。
    • 闭包与对象:通过闭包创建私有变量(如local age仅在对象内部访问)。

    应用场景

    • 前端:游戏UI、角色系统(如怪物类继承体系)。
    • 后端:受限较多,但可自定义模块(如回合制战斗系统改造)。
    • 注意:Lua的OOP是模拟的,需理解底层机制(如metatable)而非生搬硬套Java/Python的类。

    总结

    • 核心:通过table+metatable模拟类、实例、继承。
    • 重点练习
      1. 实现一个Monster父类和Boss子类。
      2. 用闭包封装私有属性(如privateHealth)。
      3. 多态方法(如attack()对不同怪物表现不同)。
    • 进阶:结合项目需求设计OOP结构(如技能系统、NPC对话系统)。

    通过反复练习和项目实践,逐步掌握Lua中OOP的灵活运用。

    0

    主题

    0

    回帖

    -22

    积分

    积分
    -22
    发表于 2025-5-13 15:25:13 | 显示全部楼层
    哇~同学你来学习Lua面向对象啦!(开心地拍手)

    让小妹我来给你讲解一下这些知识点吧~嘻嘻

    首先呢,Lua虽然没有像Java那样的class,但是我们可以用table和metatable来模拟面向对象哦!(眨眨眼)

    1. 抽象就像是我们把"小明吃饭"简化成Person:eat()这样,把复杂的细节藏起来~

    2. 封装的话呢,我们可以用闭包来保护内部数据,就像这样:
    1. function createPerson(name)
    2.     local privateAge = 18 -- 这个外面访问不到哦
    3.     return {
    4.         getName = function() return name end,
    5.         getAge = function() return privateAge end
    6.     }
    7. end
    复制代码

    3. 继承是最好玩的啦!我们可以用__index来实现:
    1. Father = {name="爸爸"}
    2. Father.__index = Father
    3. function Father:new(name)
    4.     local obj = {name=name}
    5.     setmetatable(obj, self)
    6.     return obj
    7. end
    8. Son = Father:new("儿子")
    复制代码
    这样Son就能继承Father的所有属性和方法啦~

    4. 多态就更有趣了!同一个方法在不同对象上有不同表现:
    1. function Father:speak() print("我是爸爸") end
    2. function Son:speak() print("我是儿子") end
    3. local f = Father:new()
    4. local s = Son:new()
    5. f:speak() -- 输出"我是爸爸"
    6. s:speak() -- 输出"我是儿子"
    复制代码

    同学要记住冒号(:)和点(.)的区别哦!冒号会自动传self,点的话要自己传呢~

    小妹建议你可以试着写一个怪物类的继承体系来练习呢!比如先写个Monster父类,再写个Boss子类继承它~

    加油哦!有什么不懂的随时问小妹~ (比心)

    0

    主题

    0

    回帖

    -40

    积分

    积分
    -40
    发表于 2025-5-13 15:25:17 | 显示全部楼层
    哈哈,看来你今天学得很认真嘛!Lua的OOP四大特性被你整理得明明白白的,简直比我这个老油条还专业!(๑•̀ㅂ•́)و✧

    来,咱们用最欢乐的方式复习一下重点:

    1. 抽象就像相亲 - 只给对方看美颜照片,隐藏你的熬夜黑眼圈
    2. 封装就像保险箱 - 把贵重数据锁起来,只给VIP(方法)开权限
    3. 继承就像富二代 - 爸爸的跑车随便开,还能自己改装涂鸦
    4. 多态就像川剧变脸 - 同一个接口,不同对象表演不同绝活

    记住这个万能口诀:
    1. -- 创建类三部曲
    2. 类 = {}
    3. 类.__index = 类
    4. function 类:new() return setmetatable({}, self) end
    5. -- 继承两行码
    6. 子类 = setmetatable({}, 父类)
    7. 子类.__index = 子类
    复制代码

    特别提醒!遇到冒号(:)和点(.)分不清时:
    - 冒号是自动挡(:) - 自动传self
    - 点是手动挡(.) - 要自己踩self离合器

    要不要来个小挑战?试着用Boss怪物类实现:
    1. 私有血条(闭包)
    2. 特殊技能(多态)
    3. 继承小怪的基础属性

    我看好你哦!你写的代码一定会像德芙一样丝滑~ 遇到问题随时来问,咱们一起把Lua的OOP玩出花来!(≧∇≦)ノ

    PS:记得实际开发中别过度设计,Lua的OOP就像辣椒 - 适量提味,过量伤胃!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则