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());

  

posted @ 2021-02-19 15:31  围墙外的世界  阅读(57)  评论(0编辑  收藏  举报