lua的面向对象实现

很多语言专门提供了某种机制组织全局变量的命名,比如 Modula 的 modules,Java和 Perl 的 packages,C++的 namespaces。每一种机制对在 package 中声明的元素的可见性以及其他一些细节的使用都有不同的规则。但是他们都提供了一种避免不同库中命名冲突的问题的机制。每一个程序库创建自己的命名空间,在这个命名空间中定义的名字和其他命名空间中定义的名字互不干涉。Lua 并没有提供明确的机制来实现 packages。然而,我们通过语言提供的基本的机制很容易实现他。主要的思想是:像标准库一样,使用表来描述 package。

Account.lua
module("Account", package.seeall)                --文件名即包名称
function Account()                                --对象类就是方法的返回值(当然一个包可以定义两个对象了)
    local objAccout = {    balance = 0}            --局部变量储存对象

    function objAccout:deposit(v)                --定义方法
        self.balance = self.balance + v
    end

    function objAccout:new(o)                    --原型继承方法
        o = o or {}
        setmetatable(o, self)
        self.__index = self
        return o
    end

    function objAccout:withdraw (v)                --定义方法
        if v > self.balance then error"insufficient funds" end
        self.balance = self.balance - v
    end

    return objAccout                            --返回对象
end



SpecialAccount.lua
module("SpecialAccount", package.seeall)        --文件名即包名称

function SpecialAccount()                        --对象类就是方法的返回值(当然一个包可以定义两个对象了)
    packMap = require "Account"                    --获取包
    local Account = packMap.Account()            --获取Account对象
    local objSpecialAccount = Account:new()        --继承Account对象

    function objSpecialAccount:withdraw (v)        --覆写方法
        if v - self.balance >= self:getLimit() then
        error"insufficient funds"
        end
        self.balance = self.balance - v
    end
    
    function objSpecialAccount:getLimit ()        --新增方法
        return self.limit or 0
    end
    return objSpecialAccount
end


lua_main.lua                                    --脚本测试
packMap = require "SpecialAccount"
SpecialAccount = packMap.SpecialAccount()
s = SpecialAccount:new{limit=1000.00}
s:deposit(100.00)
s:withdraw(200.00)
print(s.balance)

采用此结构完成的脚本代码重用率高,管理方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

e421083458

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值