一 .: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());
原文:https://www.cnblogs.com/weiqiangwaideshijie/p/14416354.html