Lua面向对象

lua通过使用table来实现对应的面向对象

lua中有函数,有对应的变量如下所示

Account = {balance = 0}
function Account:withdraw( v )
    if v > self.balance then error("insufficient funds") end
    self.balance = self.balance - v
end
function Account:deposit( v )
    self.balance = self.balance + v
end
function Account:new( o )
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end

在new的时候将要返回的实例设置元表Account,并将Account设置__index则能够正常访问Account里面的方法还有属性

 

当要设置子类继承的时候则直接用 SpecialAccount = Account:new()

然后我们可以在SpecialAccount这里添加对应的方法和属性

function SpecialAccount:withdraw( v )
    if v - self.balance >= self:getLimit() then
        error("insufficient funds")
    end
    self.balance = self.balance - v
end
function SpecialAccount:getLimit( )
    return self.limit or 0
end

 

如果我们要实现Account的实例,则使用 s = Account:new()

我们发现实现的实例跟子类的继承在new上面是一样的。

因为使用的都是table,new完之后可以直接使用,可以添加方法;根据自己从不同的角度来看待此次的new

function SpecialAccount:withdraw( v )这里使用的是冒号,也可以使用点的方式
function SpecialAccount.withdraw( self, v )但是使用点的时候要显示的添加self参数



2、多继承
多继承的时候需要使用中间table的方式类操作;先将所有的父类设置成可访问的__index里面;
然后将中间table作为目标对象的父类;如下所示
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})

    function c:new( o )
        o = o or {}
        setmetatable(o, c)
        c.__index = c
        return o
    end
    return c
end

中间父类c继承了所有的指定父类的属性跟方法;通过search遍历所有的父类。

添加中间父类的new方法;该new也可以在函数外面设置。这样子这个createClass相当于新建一个

Account = {}类似这样子的函数,只是初始化了__index了
Named = {}
function Named:getname( )
    return self.name
end

function Named:setname( n )
    self.name = n
end

NamedAccount = createClass(Account, Named)
account = NamedAccount:new{name = "Paul"}
print(account:getname())

这里可以createClass创建一个继承Account跟Named的新的子类NamedAccount, 我们可以在子类里面添加方法等操作

 

 

posted @ 2020-04-15 09:11  LCAC  阅读(121)  评论(0编辑  收藏  举报