Lua中的封装

Lua中没有privatetable中的key/value可以随意访问,利用metatable虽然可以施加一些限制,但是实际上有各种方法可以绕过这些限制。
下面介绍一种方法,实现真正的封装。

local LuaClass = require "LuaClass"
local TestClass = LuaClass("TestClass")
local PrivateDataMap = LuaClass:PrivateDataMap{
    "MemberA",
    "MemberB",
}

function TestClass:GetMemberA()
    return PrivateDataMap:Get(self, "MemberA")
end

function TestClass:SetMemberA(Value)
    local ExistValue = PrivateDataMap:Get(self, "MemberA")
    if ExistValue ~= Value then -- 比较差异
        PrivateDataMap:Set(self, "MemberA", Value)
        DispatchXXX -- 触发事件 
    end
end

function TestClass:GetMemberB()
    return PrivateDataMap:Get(self, "MemberB")
end

上面这段代码中,每个object对应两个成员MemberAMemberB,因为PrivateDataMap是局部变量,所以外部的代码无法直接访问,只能通过TestClass提供的接口访问这些成员。
PrivateDataMap的实现方法如下:

function LuaClass:PrivateDataMap(MemberNameList)
    local DataMap = {}
    function DataMap:Set(Owner, MemberName, Value)
        local Owner2ValueMap = DataMap[MemberName]
        if Owner2ValueMap then
            Owner2ValueMap[Owner] = Value
        end
    end

    function DataMap:Get(Owner, MemberName)
        local Owner2ValueMap = DataMap[MemberName]
        return Owner2ValueMap and Owner2ValueMap[Owner]
    end

    local CommonFunction = require "CommonFunction"
    for _, MemberName in pairs(MemberNameList) do
        DataMap[MemberName] = CommonFunction:CreateWeakTable()
    end
    return DataMap
end

其中,objectmember的对应关系存储在weaktable中,不会影响object的释放。

糖果

糖果
LUA教程

如果不小心安装错 SQL Server 为 Evaluation 的版本,要小心当超过 180 天之后,系统就会无法正常使用了 这几天遇到一个蛮特别的案例,原本收到的问题是 “维护计划” 忽然无法使用,即便是里面没有任何的Task,都无法顺利地执行。但从对方所提供的错误消...… Continue reading

PLUM NIZ静电容键盘怎么样?

Published on September 25, 2020

程序员如何选择合适的机械键盘

Published on September 18, 2020