Lua屏蔽对象方法和恢复的方法

背景

对于OO思想实现的类, 对于某些场景需要屏蔽某些方法, 不让调用。过了这段场景, 就恢复这些类的方法, 可以调用。

 

例如:

工厂具有开工方法, 但是在晚上不允许开工, 所有在晚上这段时间, 见开工方法屏蔽掉, 到第二天早上八点将此方法恢复。

实现

 

local tab = {
    new = function()
        print("new is called.")
    end,
    delete = function()
        print("delete is called.")
    end,
}


tab.new()
tab.delete()


function setHiddenProperty(tab, name)
    if not tab[name] then
        return
    end

    if not tab.__hiddenProps then
        tab.__hiddenProps = {}
    end

    local hiddenProps = tab.__hiddenProps

    hiddenProps[name] = tab[name]
    tab[name] = nil
end

function restoreHiddenPorpertys(tab)
    local hiddenProps = tab.__hiddenProps

    if not hiddenProps then
        return
    end

    for k,v in pairs(hiddenProps) do
        tab[k] = v
    end

    tab.__hiddenProps = nil
end


setHiddenProperty(tab, "new")
setHiddenProperty(tab, "delete")

-- this time call new and delete will throw error
--tab.new()
--tab.delete()

restoreHiddenPorpertys(tab)

tab.new()
tab.delete()

 

LOG:

>lua -e "io.stdout:setvbuf 'no'" "luatest.lua"
new is called.
delete is called.
new is called.
delete is called.
>Exit code: 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值