您的位置:首页 > 编程语言 > Lua

lua的面向对象实现

2015-02-28 14:57 225 查看
很多语言专门提供了某种机制组织全局变量的命名,比如 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)


采用此结构完成的脚本代码重用率高,管理方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: