最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

<strong id="cs0wi"></strong>
<bdo id="cs0wi"></bdo>
<bdo id="cs0wi"></bdo>

    1. <bdo id="cs0wi"></bdo>

      Lua面向?qū)ο笾嘀乩^承、私密性詳解

       更新時(shí)間:2014年09月15日 10:04:37   作者:笨木頭  
      這篇文章主要介紹了Lua面向?qū)ο笾嘀乩^承、私密性詳解,本文講解了多重繼承之在多個(gè)類(lèi)中查找一個(gè)字段、多重繼承之創(chuàng)建繼承多個(gè)類(lèi)的子類(lèi)、類(lèi)的私密性等內(nèi)容,需要的朋友可以參考下

      在Lua中的多重繼承和私密性可能用得比較少,也可能只是我個(gè)人用得比較少。
      本來(lái)想偷懶不寫(xiě)這文章的,因?yàn)槲医裉靹傎I(mǎi)了個(gè)漂移板,連起步都還沒(méi)學(xué)會(huì)啊,想多學(xué)一會(huì)。

      咳咳,本著堅(jiān)持不懈、負(fù)責(zé)到底的態(tài)度,我還是決定隨便寫(xiě)幾句~(小若:隨便寫(xiě)幾句是幾噸意思?。浚。?/p>

      1.多重繼承之在多個(gè)類(lèi)中查找一個(gè)字段

      我發(fā)現(xiàn)這些高(shen)智(jing)商(bing)人群真的很厲害,這種技巧都能想到,很佩服。
      其實(shí)多重繼承沒(méi)什么特別的,除非兩個(gè)將要被繼承的類(lèi)有相同的函數(shù)名和屬性,否則,處理起來(lái)很簡(jiǎn)單。
       
      無(wú)非就是在多個(gè)table中查找某個(gè)字段而已,不簡(jiǎn)單嗎?Lua里的繼承就是在別人的table里查找自己不存在的字段罷了。

      那么,單繼承與多重繼承的差別也在這里,一個(gè)是只查找一個(gè)table,另一個(gè)是查找兩個(gè)或以上的table。

      我們就先來(lái)看看如何從2個(gè)或多個(gè)table中查找某個(gè)字段,如下代碼:

      復(fù)制代碼 代碼如下:

      function search(classes, key)
          for i = 1, #classes do
              local value = classes[i][key];
              if value ~= nil then
                  return value;
              end
          end
      end
      local t1 = {name = "hehe"};
      local t2 = {game = "who"};
      print(search({t1, t2}, "game"));

      這里的classes參數(shù),是一個(gè)table,這個(gè)table里又存放了多個(gè)table,也就是我們想要繼承的那些類(lèi)。

      而key就是要查找的字段。

      只需要遍歷所有的table,判斷這個(gè)字段是否在某個(gè)table里,找到之后,就返回這個(gè)值。
      我們的測(cè)試代碼就是從t1、t2中查找game這個(gè)字段,t1、t1可以看成是兩個(gè)類(lèi)。
      輸出結(jié)果如下:

      復(fù)制代碼 代碼如下:

      [LUA-print] who

      2.多重繼承之創(chuàng)建繼承多個(gè)類(lèi)的子類(lèi)

      剛剛的search函數(shù)很簡(jiǎn)單吧?別急著開(kāi)心,那只是預(yù)熱一下而已,真正創(chuàng)建多重繼承的函數(shù)比較復(fù)雜。

      如下代碼:

      復(fù)制代碼 代碼如下:

      function createClass(...)
          local parents = {...};
          local child = {};
        
          -- 設(shè)置類(lèi)的元表
          setmetatable(child, {
              __index = function(table, key)
                  return search(parents, key);
              end
          })
        
          -- 給類(lèi)新增一個(gè)new函數(shù),用于創(chuàng)建對(duì)象
          function child:new()
              o = {};
              setmetatable(o, child);
              child.__index = child;
              return o;
          end
        
          -- 返回這個(gè)繼承了多個(gè)類(lèi)的子類(lèi)
          return child;
      end

      createClass函數(shù)就是用來(lái)創(chuàng)建一個(gè)繼承了多個(gè)類(lèi)的子類(lèi),有點(diǎn)小復(fù)雜,慢慢分析:

      1) 參數(shù)是一個(gè)可變參數(shù),我們要將多個(gè)被繼承的類(lèi)作為參數(shù)傳遞進(jìn)來(lái)
      2) parents用于保存這些被繼承的類(lèi)
      3) 創(chuàng)建一個(gè)新的table——child,它就是我們想要的那個(gè)繼承了多個(gè)類(lèi)的子類(lèi)
      4) 給child設(shè)置元表,并且設(shè)置__index元方法,__index元方法可以是一個(gè)函數(shù),當(dāng)它是一個(gè)函數(shù)時(shí),它的參數(shù)就是元表所屬的table,以及要查找的字段名。
      5) 我們?cè)赺_index元方法函數(shù)里調(diào)用search函數(shù),從多個(gè)父類(lèi)中查找所需的字段。于是,當(dāng)調(diào)用child的某個(gè)函數(shù)時(shí),就會(huì)從各個(gè)父類(lèi)中查找,這已經(jīng)完成了繼承的工作了。
      6) 接下來(lái)就是我們所熟悉的new函數(shù),用來(lái)創(chuàng)建child的子類(lèi),實(shí)現(xiàn)方式和上一篇所說(shuō)的是一樣 ,如果你忘記了,可以看看這篇文章:http://m.fzitv.net/article/55168.htm
      7) 最后返回child,一切都完成了。

      看似很復(fù)雜,其實(shí)還是對(duì)__index的應(yīng)用而已。

      我們趕緊來(lái)測(cè)試一下吧,如下代碼:

      復(fù)制代碼 代碼如下:

          --一個(gè)精靈類(lèi)
          TSprite = {}
          function TSprite:hello()
              print("誰(shuí)跟你hello!");
          end
        
          function TSprite:new()
              o = {}
              setmetatable(o, self);
              self.__index = self;
              return o;
          end
        
          -- 一個(gè)子彈類(lèi)
          TBullet = {}
          function TBullet:fire()
              print("別動(dòng),再動(dòng)我就瞄不準(zhǔn)了!");
          end
          function TBullet:new()
              o = {}
              setmetatable(o, self);
              self.__index = self;
              return o;
          end
        
          -- 繼承了兩個(gè)類(lèi)的子類(lèi)
          local BulletSprite = createClass(TSprite, TBullet);
        
          -- 子類(lèi)的對(duì)象
          local bSprite = BulletSprite:new();
          bSprite:hello();
          bSprite:fire();

      這里創(chuàng)建了兩個(gè)類(lèi):TSprite和TBullet。
      然后調(diào)用createClass函數(shù),創(chuàng)建一個(gè)繼承了TSprite和TBullet的子類(lèi)。
      最后創(chuàng)建子類(lèi)的對(duì)象,調(diào)用對(duì)象的hello和fire函數(shù)。
      輸出結(jié)果如下:

      復(fù)制代碼 代碼如下:

      [LUA-print] 誰(shuí)跟你hello!
      [LUA-print] 別動(dòng),再動(dòng)我就瞄不準(zhǔn)了!

      怎么樣?很簡(jiǎn)單吧~

      3.類(lèi)的私密性

      這里來(lái)說(shuō)一個(gè)和多重繼承無(wú)關(guān)的技巧,那就是私密性。

      對(duì)于Java、C++等語(yǔ)言,我們都很熟悉,public、private、protected等關(guān)鍵詞。
      這些關(guān)鍵詞讓封裝成為了可能。
       
      然后,Lua里是沒(méi)有私密這種說(shuō)法的,類(lèi)也是一個(gè)table,table的所有字段都是可以調(diào)用的,并沒(méi)有說(shuō)哪些是公有的,哪些是私有的。

      如果有某些函數(shù)和屬性不希望被外部調(diào)用,那么,也可以,不過(guò)這種實(shí)現(xiàn)方式看起來(lái)很別扭:

      復(fù)制代碼 代碼如下:

      function createTSprite()
          local self = {name = "benmutou"};
          local function myBus()
              print("myBus是我自己的函數(shù),你不能直接調(diào)用");
          end
          local function myGame()
              print("myGame是我自己的函數(shù),你不能直接調(diào)用");
          end
          local function hello()
              print("hello:");
              myBus();
          end
          local function hi()
              print("hi:");
              myGame();
          end
        
          local function setName(newName)
              self.name = newName;
          end
        
          return {hello = hello, hi = hi, setName = setName};
      end

      我們已經(jīng)不需要用到冒號(hào)來(lái)定義函數(shù)了,這個(gè)類(lèi)的name、myBus、myGame都是不希望給外部直接調(diào)用的。

      調(diào)用createTSprite函數(shù)后,會(huì)返回一個(gè)新的table,這個(gè)table僅僅存放了一些字段,這些字段就是能夠被外部直接調(diào)用的函數(shù)或者是屬性。

      來(lái)看看測(cè)試代碼:

      復(fù)制代碼 代碼如下:

          local sp = createTSprite();
          sp.hello();
          sp.hi();

      輸出結(jié)果如下:

      復(fù)制代碼 代碼如下:

      [LUA-print] hello:
      [LUA-print] myBus是我自己的函數(shù),你不能直接調(diào)用
      [LUA-print] hi:
      [LUA-print] myGame是我自己的函數(shù),你不能直接調(diào)用

      這樣,我們創(chuàng)建的對(duì)象就只能使用hello、hi、setName函數(shù)。

      而其他的name、myBus、myGame只能通過(guò)這幾個(gè)能使用的函數(shù)去調(diào)用,而不能直接調(diào)用。
      這樣就能完成私密性了。
       
      不過(guò),我個(gè)人有點(diǎn)迷糊,因?yàn)檫@已經(jīng)不太像一個(gè)類(lèi)的樣子了。

      4.結(jié)束

      好了,關(guān)于面向?qū)ο蟮膬?nèi)容,暫時(shí)介紹到這里。
      可能介紹的都比較基礎(chǔ),目的是為了鞏固Lua基礎(chǔ)。

      相關(guān)文章

    2. 使用Lua編寫(xiě)Web端模板引擎的實(shí)例代碼分享

      使用Lua編寫(xiě)Web端模板引擎的實(shí)例代碼分享

      這里我們給出一個(gè)使用Lua編寫(xiě)Web端模板引擎的實(shí)例代碼分享,力求簡(jiǎn)潔(核心代碼約為70行),僅實(shí)現(xiàn)最基本的模板功能:
      2016-06-06
    3. 詳解Lua中的元表和元方法

      詳解Lua中的元表和元方法

      Lua中的元表(Metatable)和元方法(Metamethods)是Lua語(yǔ)言中的重要概念,它們?cè)试S我們對(duì)對(duì)象和操作進(jìn)行自定義,本文講給大家詳細(xì)介紹一下Lua中的元表和元方法,需要的朋友可以參考下
      2023-09-09
    4. vs2012 error c4996: This function or variable may be unsafe

      vs2012 error c4996: This function or variable may be unsafe

      這篇文章主要介紹了vs2012 error c4996: This function or variable may be unsafe,需要的朋友可以參考下
      2015-04-04
    5. Lua獲取utf8字符串長(zhǎng)度和字符串截取并用...代替

      Lua獲取utf8字符串長(zhǎng)度和字符串截取并用...代替

      這篇文章主要介紹了Lua獲取utf8字符串長(zhǎng)度和字符串截取并用...代替,本文直接給出兩個(gè)函數(shù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下
      2015-04-04
    6. Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題

      Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題

      這篇文章主要介紹了Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題,本文直接給出實(shí)例代碼,需要的朋友可以參考下
      2015-07-07
    7. 讓你的python代碼更加pythonic(簡(jiǎn)練、明確、優(yōu)雅)

      讓你的python代碼更加pythonic(簡(jiǎn)練、明確、優(yōu)雅)

      這篇文章主要介紹了讓你的python代碼更加pythonic(簡(jiǎn)練、明確、優(yōu)雅),本文講解的是一種讓代碼更加清晰、簡(jiǎn)練、明確、優(yōu)雅的書(shū)寫(xiě)方法,需要的朋友可以參考下
      2014-10-10
    8. Lua教程(一):在C++中嵌入Lua腳本

      Lua教程(一):在C++中嵌入Lua腳本

      這篇文章主要介紹了Lua教程(一):在C++中嵌入Lua腳本,本文在MAC環(huán)境中開(kāi)發(fā),同時(shí)探討了IOS項(xiàng)目集成Lua、Android項(xiàng)目集成Lua等內(nèi)容,需要的朋友可以參考下
      2014-09-09
    9. 舉例講解Lua中的Table數(shù)據(jù)結(jié)構(gòu)

      舉例講解Lua中的Table數(shù)據(jù)結(jié)構(gòu)

      這篇文章主要介紹了舉例講解Lua中的Table數(shù)據(jù)結(jié)構(gòu),說(shuō)明都融入到了注釋中,需要的朋友可以參考下
      2015-07-07
    10. 最新評(píng)論

      松原市| 当阳市| 大宁县| 休宁县| 清新县| 静宁县| 宽甸| 澄城县| 康保县| 赫章县| 镇坪县| 达拉特旗| 雷波县| 会东县| 安乡县| 瑞丽市| 定边县| 卫辉市| 颍上县| 澜沧| 乐亭县| 定襄县| 隆安县| 泗阳县| 贵德县| 天水市| 深水埗区| 成安县| 烟台市| 南靖县| 沙湾县| 六安市| 扎囊县| 安泽县| 漳州市| 嘉禾县| 龙岩市| 揭东县| 镇康县| 宁阳县| 馆陶县|