一种利用lua原表实现oop的思路

2019-03-06  本文已影响0人  Half8Man

class 函数:

function class(members, methods)
    local temp = members.public

    local __private_members__ = members.private
    local __methods__ = methods

    local function indexFunc(t, k)
        if __methods__[k] then
            return __methods__[k]
        elseif __private_members__[k] then
            local msg = string.format( "warning : try to access private member [%s]", tostring(k))
            print(msg)
        else
            local msg = sttring.format("warning : not a member or method [%s]", tostring(k))
            print(msg)
        end
    end

    local function newIndexFunc(t, k, v)
        if __private_members__[k] == nil then
            local msg = string.format("warning : invalid member [%s]", tostring(k))
            print(msg)
        elseif v == nil then
            local msg = "warning : invalid value -> nil"
            print(msg)
        else
            local msg = string.format("warning : try to change private member [%s]", tostring(k))
            print(msg)
        end
    end

    local mt = {
        __index = indexFunc,
        __newindex =newIndexFunc
    }

    setmetatable(temp, mt)

    if not __methods__.ctor then
        __methods__.ctor = function()
            print("default ctor")
        end
    end
    temp.ctor()

    return temp
end

Usage:

local members = {
    private = {
        _name_  = "巴啦啦能量",
        _age_   = 12
    },

    public = {
        _sex_   = "male"
    }
}

local methods = {  }

function methods:ctor()
    members.private._name_ = "让我来朵蜜你吧"
    members.private._age_ = 23
end

function methods:setName(name)
    members.private._name_ = name
end

function methods:getName()
    return members.private._name_
end

function methods:setAge(age)
    members.private._age_ = age
end

function methods:getAge()
    return members.private._age_
end

function methods:setSex(sex)
    members.public._sex_ = sex
end

function methods:getSex()
    return members.public._sex_
end

local student = class(members, methods)

if student then
    local name1 = student:getName()
    local age1  = student:getAge()
    local sex1  = student:getSex()
    print(name1, age1, sex1)

    student:setName("巴啦啦能量")
    student:setAge("12")
    student:setSex("female")
    local name2 = student:getName()
    local age2 = student:getAge()
    local sex2 = student:getSex()
    print(name2, age2, sex2)

    student._name_  = "你们不要打啦"
    student._age_   = "19"
    student._sex_   = "unknown"
    local name3 = student._name_
    local age3  = student._age_
    local sex3  = student._sex_
    print(name3, age3, sex3)
end

output

让我来朵蜜你吧 23  male    
巴啦啦能量   12  female  
warning : try to change private member [_name_] 
warning : try to change private member [_age_]  
warning : try to access private member [_name_] 
warning : try to access private member [_age_]  
unknown

PS

1.支持面向对象
2.支持访问权限控制
3.必须在 local members = { } 中初始化成员,否则未初始化成员声明无效
4.本文为一个lua实现OOP的思路,如有遗漏的地方,欢迎大家留言

上一篇 下一篇

猜你喜欢

热点阅读