回顾:安全保险库
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 48 课,共 70 课。
挑战
简单让我们构建一个使用基于闭包的隐私保护的 Vault 类,创建真正安全的存储系统!保险库会保存秘密内容,只有提供正确的密码才能访问。
你需要将代码分成两个文件:
Vault.lua:创建一个类,在构造函数中将内容和密码都存储为局部变量,完全隐藏它们,不让外部访问。构造函数:new(contents, password)应将这些值存储在局部变量中,然后直接在对象实例上定义一个方法::open(attemptedPassword):检查尝试输入的密码是否与存储的密码匹配。如果匹配,就返回秘密内容。如果不匹配,就返回"Access Denied"。
main.lua:引入你的 Vault 模块,并读取三个输入:要存储的秘密内容、要设置的密码,以及一次密码尝试。使用内容和密码创建一个保险库,然后尝试用输入的密码打开它,并打印结果。还要尝试直接访问vault.contents并打印结果,以此证明内容确实是私有的。
你会收到三个输入:
- 要存储在保险库中的秘密内容
- 用于保护保险库的密码
- 尝试打开保险库时输入的密码
你的输出应该有两行:
Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}例如,如果输入是 Gold Coins、secret123 和 secret123,输出应该是:
Result: Gold Coins
Direct access: nil如果输入是 Diamond、mypass 和 wrongpass,输出应该是:
Result: Access Denied
Direct access: nil关键在于,contents 和 password 都只作为构造函数中的局部变量存在。:open() 方法可以通过闭包访问它们,但其他任何东西都无法访问它们,甚至包括 vault.contents、vault._contents 或 vault.password。这就是真正的封装!
亲手试试
-- 加载 Vault 模块
local Vault = require('Vault')
-- 读取输入
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()
-- TODO: 用 contents 和 password 创建一个保险库
-- TODO: 尝试用 attemptedPassword 打开保险库
-- TODO: 按以下格式打印结果:"Result: {resultFromOpen}"
-- TODO: 尝试直接访问 vault.contents,并打印获取到的内容
-- 按以下格式打印:"Direct access: {whatYouGetFromVaultContents}"
面向对象编程中的所有课
自己练习: Lua 在线编译器