美文网首页
一种利用lua原表实现oop的思路

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

作者: Half8Man | 来源:发表于2019-03-06 23:13 被阅读0次

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的思路,如有遗漏的地方,欢迎大家留言

相关文章

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

    class 函数: Usage: output PS 1.支持面向对象2.支持访问权限控制3.必须在 local ...

  • Lua实现KVO

    Lua元表使用 __index和__newindex方法有点类似get和set方法,可以利用这个特性实现监听tab...

  • LUA OOP

    -- Class of ParentClass Animals = {x = 0, y = 0}; Animals...

  • Lua 实现面向对象 (原创)

    要理解Lua是如何实现面向对象的。首先要熟悉Lua元表的相关知识,可以阅读我上一篇文章《Lua元表 (Metata...

  • 2018-08-02

    lua实现继承,重载和多态(上) *讲到lua的继承等面向对象的实现,首先得讲一下lua中的几个元方法和元表. s...

  • Lua实现继承的方法

    lua通过元表实现继承 lua查找一个表元素的规则如下 1.在表中查找,如果找到,则返回这个元素 2.判断该表是否...

  • Lua middleclass 详解

    A simple OOP library for Lua. It has inheritance, metamet...

  • 将链表L就地逆置,即利用原表各结点的空间实现逆置

    一、题目 将链表L就地逆置,即利用原表各结点的空间实现逆置。 二、思路 在链表的第二个元素开始执行逆置,因为如果链...

  • 联合查询jjjj

    (利用spring、springMVC、hibernate实现对员工表的联合查询) 联合查询思路 通过从客户端传回...

  • django的form的小web程序

    要求:利用django的form组件,实现添加的功能 思路数据库(settings.py)--->表(models...

网友评论

      本文标题:一种利用lua原表实现oop的思路

      本文链接:https://www.haomeiwen.com/subject/puvfpqtx.html