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, 我们可以在子类里面添加方法等操作