Lua面向对象

来源:互联网 发布:java多线程 单例 编辑:程序博客网 时间:2024/05/31 05:28

lua没有class的概念,但是可以直接继承其他对象
单继承:

     base = { a = 1 , funca = function() return " base " end}     function base:new(o)          local o = o or {}          setmetatable(o, self)          self.__index = self          return o     end     child_1 = base:new()     child_1.funcb = function() return "child1" end    child_2 = child_1:new()    print(child_2.a .. child_2.funca() .. child_2.funcb())    -->1 base child1

多重继承:

    local function search(k, plist)        for i = 1, #plist do            local v = plist[i][k]            if v then return v end        end    end    function createClass(...)        local c = {}        local parents = {...}    --设置元方法        setmetatable(c, {__index = function(t,k)            return search(k, parents)            end})    --设置元方法        c.__index = c        function c:new(o)            o = o or {}            setmetatable(o, c)            return o        end        return c    end    Named = {}    function Named:getname()        return self.name    end    Account = { name = "Tom" }    NamedAccount = createClass(Named, Account)    account = NamedAccount:new()    print(account:getname())

以上代码中的createClass可以生成一个新table,里面包含了两个基类中的成员,在最后的新对象NamedAccount中,调用account:getname时,程序会先在account中找,然后在 Named和Account中寻找同名的方法,这样会略微影响效率,也可以用空间换时间的方法修改上面的–设置元方法中的代码:

    setmetatable(c, {__index = function(t,k)    local v = search(k, parents)    t[k] = v    return v        end})

简单的继承方法:

这里写图片描述
这里写图片描述

0 0
原创粉丝点击