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

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

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

在Lua中的多重繼承和私密性可能用得比較少,也可能只是我個人用得比較少。
本來想偷懶不寫這文章的,因為我今天剛買了個漂移板,連起步都還沒學(xué)會啊,想多學(xué)一會。

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

1.多重繼承之在多個類中查找一個字段

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

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

我們就先來看看如何從2個或多個table中查找某個字段,如下代碼:

復(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ù),是一個table,這個table里又存放了多個table,也就是我們想要繼承的那些類。

而key就是要查找的字段。

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

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

[LUA-print] who

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

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

如下代碼:

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

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

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

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

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

我們趕緊來測試一下吧,如下代碼:

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

    --一個精靈類
    TSprite = {}
    function TSprite:hello()
        print("誰跟你hello!");
    end
  
    function TSprite:new()
        o = {}
        setmetatable(o, self);
        self.__index = self;
        return o;
    end
  
    -- 一個子彈類
    TBullet = {}
    function TBullet:fire()
        print("別動,再動我就瞄不準了!");
    end
    function TBullet:new()
        o = {}
        setmetatable(o, self);
        self.__index = self;
        return o;
    end
  
    -- 繼承了兩個類的子類
    local BulletSprite = createClass(TSprite, TBullet);
  
    -- 子類的對象
    local bSprite = BulletSprite:new();
    bSprite:hello();
    bSprite:fire();

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

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

[LUA-print] 誰跟你hello!
[LUA-print] 別動,再動我就瞄不準了!

怎么樣?很簡單吧~

3.類的私密性

這里來說一個和多重繼承無關(guān)的技巧,那就是私密性。

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

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

復(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)不需要用到冒號來定義函數(shù)了,這個類的name、myBus、myGame都是不希望給外部直接調(diào)用的。

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

來看看測試代碼:

復(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)建的對象就只能使用hello、hi、setName函數(shù)。

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

4.結(jié)束

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

相關(guān)文章

  • 使用Lua編寫Web端模板引擎的實例代碼分享

    使用Lua編寫Web端模板引擎的實例代碼分享

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

    詳解Lua中的元表和元方法

    Lua中的元表(Metatable)和元方法(Metamethods)是Lua語言中的重要概念,它們允許我們對對象和操作進行自定義,本文講給大家詳細介紹一下Lua中的元表和元方法,需要的朋友可以參考下
    2023-09-09
  • 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
  • Lua獲取utf8字符串長度和字符串截取并用...代替

    Lua獲取utf8字符串長度和字符串截取并用...代替

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

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

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

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

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

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

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

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

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

    合水县| 株洲市| 郴州市| 台北市| 鸡东县| 南召县| 庄浪县| 盐边县| 罗定市| 台北市| 武强县| 安顺市| 嘉善县| 蓬安县| 呼图壁县| 丰城市| 灵台县| 新巴尔虎右旗| 浦东新区| 富蕴县| 青岛市| 通渭县| 乌拉特中旗| 岢岚县| 鄂尔多斯市| 南召县| 怀远县| 和静县| 马山县| 东安县| 星子县| 凤凰县| 临沂市| 勃利县| 浑源县| 益阳市| 伊金霍洛旗| 成安县| 颍上县| 宜宾县| 阜康市|