微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

lua 封装成C++风格的类

编写lua代码时全用函数非常不好管理项目,在网上找到的一个C++风格的封装类,mark一下。 首先是baseClass:

local function parseName(str)
    local _begin,_end,cls = assert(str:find('%s*([a-zA-Z][a-zA-Z0-9_]*)%s*%:?'))
    if not str:find(':',_end) then
        return cls,{}
    end
    local bases = {}
    while true do
        local base
        _begin,base = str:find('%s*([a-zA-Z][a-zA-Z0-9_]*)%s*%,?',_end + 1)
        if base then
            table.insert(bases,base)
        else
            break
        end
    end
    return cls,bases
end

local function create(t,...)
    local o = {}
    if t.__init__ then
        t.__init__(o,...)
    end
    return setMetatable(o,{__index = t,__class__ = t})
end

function class(name)
    local env = getfenv(2)
    local clsName,bases = parseName(name)
    for i,v in ipairs(bases) do
        bases[i] = env[v]   --Replace string name with class table
    end

    return function (t)
        local Meta = {__call = create,__bases__ = bases}
        Meta.__index = function(nouse,key)
            for _,cls in ipairs(Meta.__bases__) do
                local val = cls[key]    --Do a recursive search on each cls
                if val ~= nil then
                    return val
                end
            end
        end
        -- t.class = t  --指向类,可以用于添加类成员
        t.className = clsName --类名string
        -- t.super = bases[1] --多重继承的第一个父类
        env[clsName] = setMetatable(t,Meta)
    end
end

使用方法

-- c++风格创建
class 'Person'  --define a Class
{
     __init__ = function(self,name) --define an instance initializer
         self.name = name
     end,say = function(self)            --define a method
         if self.super then
             print("className: ",self.className,"super: ",self.super.className)
         else
             print("className: ",self.className)
         end
         print('Hello,my name is ' .. (self.name or "no name") .. '.')
         self:saySthElse()
     end,saySthElse = function(self)
     end
 }

 class 'Employee: Person'  --define a class inheriting class Person defined as above
 {
    __init__ = function(self,name,salary)
         Person.__init__(self,name)  --call base class's method directly
         self.salary = salary
     end;

     saySthElse = function(self)      --override base class's method
         print('My salary is ' .. (self.salary or "no salary") .. '.')
     end
}
一个方法之间需要用逗号隔开,因为这些函数都属于table的一个元素。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐