lua-面向对象
一 .:self
lua编程中,经常遇到函数的定义和调用,有时候用点号调用,有时候用冒号调用。
Account={num=0}; function Account.Minus(self,num) self.num=self.num-num; end function Account:AddNum(num)--:是一种语法糖,隐藏了self参数,更加方便 self.num=self.num+num; end Account:AddNum(10); print(Account.num); Account.Minus(Account,10); print(Account.num)
二 继承的实现
简单来说就是设置一下元表,然后将元表本身赋值给元表里面的__index元方法
Fathter={Age=10}; function Fathter:New(c) c=c or {}; setmetatable(c,self); self.__index=self; return c; end function Fathter:AddAge(age) self.Age=self.Age+age; print("FathterAge"); end local sun=Fathter:New({Height=100}); print(sun.Height); print(sun.Age); print("--------------------------------"); local grandSun=sun:New({Weight=1000}); print(getmetatable(grandSun)==sun); print(grandSun.Height); print(grandSun.Age); print(grandSun.Weight); print("--------------------------------"); --grandSun:AddAge(10); print(grandSun.Age); print("--------------------------------"); function grandSun:AddAge(age) self.Age=self.Age+age; print("grandSunAge"); end grandSun:AddAge(10); print(grandSun.Age);
三 多继承的实现
简单来说就是将一个函数赋值给元表的__index元方法。这个函数的功能是获得一下所有“父类”里面的指定的"方法"。
local function search(k,pList) for i=1,#pList do local v=pList[i][k]--这里相当于调用c["GetName"] if v then return v; end end end function createClass(...) local c={}; local parens={...}; setmetatable(c,{__index=function(t,k)--第一个参数表示的原始表,第二个参数表示的所要查询的key return search(k,parens); end }); function c:New(o) o=o or{}; setmetatable(o,c); c.__index=c; return o; end return c; end Named={Name="yy"}; function Named:GetName() return self.Name; end function Named:SetName(name) self.Name=name; end Account={balance=0}; NamedAccount=createClass(Account,Named); accoutName=NamedAccount:New({Name="XX"}); print(accoutName:GetName());