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

      

  • 相关阅读:
    git上刚下载的项目就显示有改动
    Windows Server 2012 R2安装Oracle 11g问题
    maven项目更换本地仓库
    dom4j创建和解析xml文档
    java倒计时三种简单实现方式
    JS倒计时两种种实现方式
    java加载properties文件的六中基本方式实现
    MYSQL 高级语法
    MYSQL 基础语法
    Sql 代码规范说明
  • 原文地址:https://www.cnblogs.com/weiqiangwaideshijie/p/14416354.html
Copyright © 2011-2022 走看看