【Lua】面向对象的实现方式

第一种实现方式: (实现了私有变量和公有变量)

local BaseClass = {
    ctor = function (self, params)
        self._name = params.name or "John"
        self._sex = params.sex or "man"
    end,

    new = function (mt, params)
        local instance = {
            privateElements = {},
            publicElements = {},
            classIndex = 0
        }
        setmetatable(instance, {
            __index = function (tb, key)
                if tb.classIndex == 0 then
                    if type(key) == "string" and string.sub(key,1,1) == "_" then
                        assert(false, "Private variables cannot be accessed.")
                    end
                    if tb.publicElements[key] then
                        if type(tb.publicElements[key]) == "function" then
                            return function (obj, ...)
                                local oriIndex = tb.classIndex
                                tb.classIndex = 1
                                local ret = {tb.publicElements[key](obj, ...)}
                                tb.classIndex = oriIndex
                                return unpack(ret)
                            end
                        else
                            return tb.publicElements[key]
                        end
                    end
                else
                    return tb.publicElements[key] or tb.privateElements[key]
                end
            end,
            __newindex = function (tb, key, value)
                if tb.classIndex == 0 then
                    if type(key) == "string" and string.sub(key,1,1) == "_" then
                        assert(false, "Private variables cannot be accessed.")
                    end
                    tb.publicElements[key] = value
                else
                    if type(key) == "string" and string.sub(key,1,1) == "_" then
                        tb.privateElements[key] = value
                    else
                        tb.publicElements[key] = value
                    end
                end
            end
        })
        for key, value in pairs(mt) do
            if type(key) == "string" and string.sub(key,1,1) == "_" then
                instance.privateElements[key] = value
            else
                instance.publicElements[key] = value
            end
        end
        instance:ctor(params)
        return instance
    end,

    getName = function (self)
        return self._name
    end,

    getSex = function (self)
        return self._sex
    end
}

local john = BaseClass:new({name = "John", sex = "man"})
local marry = BaseClass:new({name = "marry", sex = "marry"})

print(john:getName())
print(john:getSex())

print(marry:getName())
print(marry:getSex())

测试结果:

 

第二种实现方式 :

local BaseClass = {
    ctor = function (self, params)
        self._name = params.name or "John"
        self._sex = params.sex or "man"
    end,

    new = function (mt, params)
        local instance = { }
        setmetatable(instance, mt)
        mt.__index = mt
        instance:ctor(params)
        return instance
    end,

    getName = function (self)
        return self._name
    end,

    getSex = function (self)
        return self._sex
    end
}

local john = BaseClass:new({name = "John", sex = "man"})
local marry = BaseClass:new({name = "marry", sex = "women"})

print(john:getName())
print(john:getSex())

print(marry:getName())
print(marry:getSex())

测试结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值