• Chapter 16_4 私密性


      在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 》

  • 相关阅读:
    38861cba61c66739c1452c3a71e39852.ttf net::ERR_ABORTED 404 (Not Found)
    php 进制转换base_convert
    mysql find_in_set 函数 使用方法
    xmind 破解
    python 获取 一个正整数的二进制
    算法 求一个数的平方根
    详细的描述一个测试活动完整的过程。
    常见的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。
    HTTP 协议中 Vary 的一些研究
    svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
  • 原文地址:https://www.cnblogs.com/daiker/p/5882777.html
Copyright © 2020-2023  润新知