Chapter 16_4 私密性

本文介绍Lua中如何通过闭包和双表结构实现面向对象编程中的私有成员,确保对象的状态不能被未授权访问,同时提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在Lua面向对象编程的基础设计当中,没有提供私密性机制。但是可以用其他方法实现,从而获得对象的访问控制。

这种实现不常用,作为兴趣爱好,只做基本了解。

基本做法是:通过两个table来表示一个对象。一个用来保存状态,一个用于操作(或称为接口)。

为了避免未授权的访问,表示状态的table不保存在其他table中,而只是保存在方法的closure中。

例如:

function newAccount(initialBalance)
    local self = { balance = initialBalance }
    local withdraw = function (v)
                    self.balance = self.balance - v
                end
    local deposit = function(v)
                    self.balance = self.balance + v
                end
    local getBalance = function()
                    return self.balance
                end
    return {
        withdraw = withdraw,
        deposit    = deposit,
        getBalance = getBalance
    }
end

该函数先创建了一个table,用于 保存对象的内部状态,并将其存储在局部变量self中。

然后再创造对象的方法。最后,函数创建并返回一个供外部使用的对象,其中将方法名与真正的方法实现匹配起来。

区别关键在于,这些方法不需要额外的self参数,因为他们可以直接访问self的变量。

所以可以像普通函数调用一样:

acc1 = newAccount(100.00)
acc1.withdraw(40.00)
print(acc1.getBalance())        --> 60

这种设计给予在self中所有东西完全的私密性。当newAccount返回后,就无法直接访问这个table了。

只能通过newAccount中创建的新函数来访问它。

还可以将一个对象中所有的私有部分都放入这个私有table。另外也可以定义私有的方法,类似于公有方法,但不放入接口中。

例如,该账户给那些余额大于10000的用户额外10%的信用额度,但是不想让用户访问到这些计算细节:

function newAccount(initialBalance)
    local self = {
            balance = initialBalance,
            LIM = 10000.00,
        }
    local extra = function()
        if self.balance > self.LIM then
            return self.balance * 0.10
        else
            return 0
        end
    end
    local getBalance = function()
        return self.balance + extra()
    end

<如前>

这样,任何用户都无法直接访问extra函数。

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

转载于:https://www.cnblogs.com/daiker/p/5882777.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值