亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua面向對象之多重繼承、私密性詳解

2024-07-21 23:04:04
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

復制代碼 代碼如下:

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

而key就是要查找的字段。

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

復制代碼 代碼如下:

[LUA-print] who

 

2.多重繼承之創建繼承多個類的子類

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

如下代碼:

復制代碼 代碼如下:

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

 

createClass函數就是用來創建一個繼承了多個類的子類,有點小復雜,慢慢分析:

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

看似很復雜,其實還是對__index的應用而已。

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

復制代碼 代碼如下:

    --一個精靈類
    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();

 

這里創建了兩個類:TSprite和TBullet。
然后調用createClass函數,創建一個繼承了TSprite和TBullet的子類。
最后創建子類的對象,調用對象的hello和fire函數。
輸出結果如下:

復制代碼 代碼如下:

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

怎么樣?很簡單吧~

 

3.類的私密性

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

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

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

復制代碼 代碼如下:

function createTSprite()
    local self = {name = "benmutou"};
    local function myBus()
        print("myBus是我自己的函數,你不能直接調用");
    end
    local function myGame()
        print("myGame是我自己的函數,你不能直接調用");
    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

 

我們已經不需要用到冒號來定義函數了,這個類的name、myBus、myGame都是不希望給外部直接調用的。

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

來看看測試代碼:

復制代碼 代碼如下:

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

 

輸出結果如下:

復制代碼 代碼如下:

[LUA-print] hello:
[LUA-print] myBus是我自己的函數,你不能直接調用
[LUA-print] hi:
[LUA-print] myGame是我自己的函數,你不能直接調用

這樣,我們創建的對象就只能使用hello、hi、setName函數。

 

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

4.結束

好了,關于面向對象的內容,暫時介紹到這里。
可能介紹的都比較基礎,目的是為了鞏固Lua基礎。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
超碰日本道色综合久久综合| 亚洲国产精品视频在线观看| 欧美尺度大的性做爰视频| 国产精品∨欧美精品v日韩精品| 夜夜嗨av色综合久久久综合网| 日韩av电影在线播放| 欧美日韩一区二区精品| 欧美日韩成人在线播放| 精品在线小视频| 国产色婷婷国产综合在线理论片a| 日韩欧美在线视频| 亚洲欧美中文日韩v在线观看| 伊人久久久久久久久久| 蜜月aⅴ免费一区二区三区| 日韩精品欧美国产精品忘忧草| 国产男女猛烈无遮挡91| 中文字幕欧美视频在线| 自拍偷拍免费精品| 国产性猛交xxxx免费看久久| 欧美日韩一区二区三区在线免费观看| 国产精品揄拍一区二区| 欧美日韩国产综合视频在线观看中文| 日韩**中文字幕毛片| 久热精品视频在线观看| 欧美乱大交xxxxx另类电影| 欧美疯狂做受xxxx高潮| 精品电影在线观看| 欧洲美女免费图片一区| 欧美猛交免费看| 久久久999国产精品| 久久久久女教师免费一区| 欧美三级免费观看| 国产精品欧美激情在线播放| 欧美激情视频一区| 色yeye香蕉凹凸一区二区av| 操日韩av在线电影| 在线精品91av| 欧美在线播放视频| 青青草99啪国产免费| 欧美日韩国产999| 在线播放国产一区中文字幕剧情欧美| 久久久99久久精品女同性| 日韩av大片在线| 亚洲人成人99网站| 日韩少妇与小伙激情| 日本精品免费一区二区三区| 欧美高清videos高潮hd| 国产精品网红福利| 在线播放日韩专区| 日韩欧美亚洲范冰冰与中字| 欧美在线视频播放| 久久久精品久久久久| 国产精品入口免费视频一| 国产97色在线| 国产精品极品尤物在线观看| 国产日韩欧美视频| 欧美日韩亚洲视频| 亚洲国产精品悠悠久久琪琪| 亚洲精品免费在线视频| 国产精品成人一区二区| 亚洲一区中文字幕| 亚洲国产精久久久久久| 亚洲永久免费观看| 国产一区二区三区高清在线观看| 日韩欧美亚洲综合| 国产亚洲欧美日韩精品| 成人综合国产精品| 在线性视频日韩欧美| 日韩电影在线观看永久视频免费网站| 久久综合亚洲社区| 成人黄色影片在线| 91精品在线播放| wwwwwwww亚洲| 欧美激情中文字幕在线| 亚洲在线视频观看| 性欧美亚洲xxxx乳在线观看| 欧美老女人xx| 日韩在线欧美在线| 91老司机精品视频| 亚洲乱码一区av黑人高潮| 永久免费看mv网站入口亚洲| 欧美日本亚洲视频| 精品福利免费观看| 欧美老女人性生活| 成人福利视频在线观看| 日韩免费看的电影电视剧大全| 国产伦精品一区二区三区精品视频| 国产91在线播放| 日韩精品有码在线观看| 欧美日韩激情视频8区| 日韩福利在线播放| 91精品国产综合久久香蕉| 欧美大荫蒂xxx| 国产精品丝袜久久久久久高清| 欧美日韩国产精品一区二区三区四区| 久久综合久久八八| 久久久久成人精品| 在线观看国产精品淫| 亚洲白拍色综合图区| 亚洲片在线资源| 热久久免费视频精品| 亚洲激情成人网| 国产精品成人免费视频| 色综合久久88色综合天天看泰| 91系列在线播放| 98精品国产高清在线xxxx天堂| 日韩精品视频中文在线观看| 国产日韩精品在线观看| 日av在线播放中文不卡| 国产一区二区三区直播精品电影| 国产精品video| 亚洲日本中文字幕免费在线不卡| 亚洲一区二区三区在线免费观看| 欧美一区二三区| 国模精品视频一区二区三区| 欧美丰满少妇xxxxx| 亚洲成人动漫在线播放| 久久久久国产精品一区| 欧美亚洲在线观看| 91高清视频在线免费观看| 亚洲国产欧美在线成人app| 国产精品第七十二页| 日本精品在线视频| 中文字幕欧美日韩| 亚洲欧美制服另类日韩| 日韩精品小视频| 一区二区三区高清国产| 亚洲最大av在线| 日韩电影视频免费| 欧美亚洲激情视频| 91久久精品视频| 亚洲第一视频在线观看| 热草久综合在线| 日本一本a高清免费不卡| 国产精品永久免费观看| 国产一区二区三区在线| 亚洲xxx视频| 日韩美女视频免费看| 日韩av免费在线| 欧美一级黑人aaaaaaa做受| 日韩成人中文字幕在线观看| 欧美老女人性生活| 亚洲欧美另类中文字幕| 亚洲色图校园春色| 久久天天躁狠狠躁夜夜躁| 91情侣偷在线精品国产| 97色在线观看| 性视频1819p久久| 欧美日韩美女在线观看| 国产精品一区二区性色av| 九九久久久久99精品| 国内精品视频在线| 亚洲欧美激情四射在线日| 亚洲国产欧美一区二区丝袜黑人| 日韩三级影视基地| 欧美在线激情视频| 日韩av色在线| 国产欧美一区二区白浆黑人| 亚洲国产欧美一区二区三区同亚洲| 亚洲成人黄色在线观看| 啊v视频在线一区二区三区| 欧美激情综合色| 91精品综合久久久久久五月天| 精品国产美女在线|