zoukankan      html  css  js  c++  java
  • 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());
    

      

  • 相关阅读:
    CTE SQL Server 转
    论坛搜索网站技术概述 供参考
    SQL 存储过程 数据分页源代码
    sql server中使用convert来取得datetime数据类型样式(全)
    SQL Server 2008系统信息查询常用命令 查看表大小、记录数等
    用正则表达式匹配HTML\XML等文件中的标签
    使用.Net访问Office编程接口
    不显示某字段有重复的记录 SQL语句
    操作XMLC#(转)
    关于CASE中使用聚合函数时的一点经验
  • 原文地址:https://www.cnblogs.com/weiqiangwaideshijie/p/14416354.html
Copyright © 2011-2022 走看看