• Chapter 16_0 面向对象编程


      Lua中的table就是一种对象。

      1、table和对象一样拥有状态

      2、和对象一样有一个独立的标识符(a self)

      3、和对象一样,具有独立于创建者和创建地的生命周期。

    对象有他们自己的操作,table同样也有:

    Account = {balance = 0}
    function Account.withdraw(v)
        Account.balance = Account.balance -v 
    end

    有了上面的定义,可以这样调用:

    Account.withdraw(100.00)

    这种函数就是所谓的“方法(Method)”,不过在函数里面使用全局Account是一个不好的编程习惯。

    因为这个函数只能针对特定对象工作。并且,这个特定对象还必须存储在特定的全局变量中。

    如果改变了对象的名称,withdraw就再也不能工作了:

    a,Account = Account,nil
    a.withdraw(100.00)    -- Error !

    这种行为违反了前面提到的对象特性,即对象拥有独立的生命周期。

    有一种灵活的方法,即指定一项操作所作用的“接受者”。因此需要一个额外的参数来表示该接受者。通常为self或this:

    function Account.withdraw(self, v )
        self.balance = self.balance - v
    end

    再去调用该方法,必须指定其作用的对象:

    a1 = Account ; Account = nil
    ...
    al.withdraw(a1, 100.00)        -- OK

    通过self参数,可以在多个对象中使用同样的方法。

    a2 = {balance = 0 , withdraw = Account.withdraw}
    ...
    a2.withdraw(a2, 260.00)

    其实不用显式地声明这个参数,Lua中只需要使用冒号:

    function Account:withdraw(v)
        self.balance = self.balance -v 
    end

    方法调用:

    a:withdraw(100.00)

    可以用点语法来定义一个函数,并用冒号语法去调用。反之,只要能正确处理好哪个额外的参数即可:

    Account = { balance = 0,
                        withdraw = function(self, v)
                                self.balance - v
                        end
                    }
    function Account:deposit(v)
        self.balance = self.balance + v
    end
    Account.deposit(Account, 200.00)
    Account:withdraw(100.00)

    现在的对象已有一个标识、一个状态和状态之上的操作。还缺乏一个类(class)系统、继承和私密性(privacy)。

    接下来的小结,将会介绍如果创建多个具有类似行为的对象,即如何创建多个account账户对象。

     以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

  • 相关阅读:
    IIS下配置跨域设置Access-Control-Allow-Origin
    Arcgis去除Z,M值
    GIS开发之数据查询
    GIS开发之计算四参数,七参数
    Openlayer3之绚丽的界面框架-Materialize
    Openlayer3之C++接口在javaScript的封装使用
    Windows环境和Linux环境下Redis主从复制配置
    Centos 7 安装和配置Redis
    .net手动编写Windows服务
    SQL获取当前日期的年、月、日、时、分、秒数据
  • 原文地址:https://www.cnblogs.com/daiker/p/5881550.html
Copyright © 2020-2023  润新知