首页 > 代码库 > Chapter 16_4 私密性
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 》
Chapter 16_4 私密性
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。