• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Lua 极简入门指南(七):面向对象编程

    在很多面向对象的语言中有类(class)的概念,对象是类的实例。Lua 中不存在类的概念。Lua 就像 JavaScript 一样是面向原型的语言(http://en.wikipedia.org/wiki/Prototype-based_programming),这类语言使用一个对象表示一个“类”,其他对象(此类的实例)使用此对象作为原型。我们有两个 table p 和 obj,将 p 设置为 obj 的原型(回顾:https://www.jb51.net/article/56690.htm):

    复制代码 代码如下:

    setmetatable(obj, {__index = p})

    obj 中不存在的操作会在 p 中查找。

    看一个详细的例子:

    复制代码 代码如下:

    Account = {
        -- 默认的 balance 的值
        balance = 0
    }
     
    function Account:new(o)
        o = o or {}
        -- 设置原型为 Account
        setmetatable(o, self)
        self.__index = self
        return o
    end
     
    function Account:deposit(v)
        self.balance = self.balance + v
    end
     
    function Account:withdraw(v)
        if v > self.balance then
            print('insufficient funds')
            return
        end
        self.balance = self.balance - v
    end
     
    -- 构建 Account 对象,初始 balance 为 100
    local a1 = Account:new{balance = 100}
    a1:deposit(100)    --> balance == 200
    a1:withdraw(100)   --> balance == 100
     
    -- 构建 Account 对象,使用默认的 balance
    local a2 = Account:new()
    a2:deposit(100)    --> balance == 100

    在方法定义时使用冒号能够添加一个隐藏的参数 self 给方法,在方法调用时使用冒号能够将调用者作为一个额外的参数传递给此方法,例如:

    复制代码 代码如下:

    -- 以下两种写法等价
    function Account:deposit(v)
    function Account.deposit(self, v)
     
    -- 以下两种写法等价
    a1:deposit(100)
    a1.deposit(a1, 100)

    self 为方法的调用者。

    在 Account 这个例子中,一个小优化是,我们没有必要创建一个额外的 metatable,而直接使用 Account 作为 metatable。

    继承

    我们通过一个例子来解释 Lua 如何实现继承。假定我们需要子类 SpecialAccount 继承于 Account,SpecialAccount 是可以透支的。

    首先构造一个子类:

    复制代码 代码如下:

    SpecialAccount = Account:new()

    这里 SpecialAccount 拥有了(继承了)Account 的 new 方法。那么我们就可以使用 SpecialAccount 构建对象:
    复制代码 代码如下:

    local sa = SpecialAccount:new{limit = 1000}
    sa:withdraw(100)

    这里通过 SpecialAccount:new 构造了对象 sa,并且 sa 的 metatable 为 SpecialAccount。执行 sa:withdraw(100),Lua 在 sa 中找不到 withdraw,就会在 SpecialAccount 中找,在 SpecialAccount 中也找不到 withdraw,然后在 Account 中找到 withdraw 并调用它。Account 中的 withdraw 显然不是我们想要的,我们在 SpecialAccount 中重新定义它:

    复制代码 代码如下:

    function SpecialAccount:withdraw(v)
        if v - self.balance >= self:getLimit() then
            print('insufficient funds')
            return
        end
        self.balance = self.balance - v
    end
     
    function SpecialAccount:getLimit()
        return self.limit or 0
    end

    我们再调用 sa:withdraw(100),Lua 先在 SpecialAccount 中找到 withdraw 并调用它。

    您可能感兴趣的文章:
    • Lua脚本语言简明入门教程
    • Lua极简入门指南(一):基础知识篇
    • Lua极简入门指南(三): loadfile和错误处理
    • Lua极简入门指南(一):函数篇
    • Lua极简入门指南:全局变量
    • lua脚本语言快速入门教程
    • Lua入门学习笔记
    • Lua极简入门指南(六):模块
    • Lua脚本语言基本语法快速入门教程
    • Lua语言新手简单入门教程
    上一篇:Lua极简入门指南(六):模块
    下一篇:Lua中实现php的strpos()以及strrpos()函数
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Lua 极简入门指南(七):面向对象编程 Lua,极简,入门,指南,七,面向,