麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Lua中類(lèi)的實(shí)現(xiàn)

2024-07-21 23:04:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

概述

     一個(gè)類(lèi)就是像是一個(gè)創(chuàng)建對(duì)象的模具,對(duì)于Lua這種沒(méi)有類(lèi)的概念的語(yǔ)言,為了模擬類(lèi),方法是為要?jiǎng)?chuàng)建的對(duì)象制定一個(gè)原型(prototype)。這個(gè)原型相當(dāng)于其他語(yǔ)言中的類(lèi)。但是原型同時(shí)也是一種常規(guī)的對(duì)象,當(dāng)其他的對(duì)象(看成是原型的實(shí)例)遇到一個(gè)未知的操作時(shí),就會(huì)去原型中查找。因此,在Lua這種沒(méi)有類(lèi)的語(yǔ)言中,為了表示一個(gè)類(lèi),只需創(chuàng)建一個(gè)專(zhuān)用作其他對(duì)象的原型。類(lèi)和原型都是一種組織對(duì)象間共享行為的方式。本文將在Lua中模擬類(lèi),相關(guān)的代碼可以在我的github上直接運(yùn)行。

 實(shí)現(xiàn)

 在Lua中要模擬類(lèi)比較關(guān)鍵的地方就是class的繼承機(jī)制,以及class實(shí)例化的過(guò)程,這個(gè)過(guò)程的主要是用了元表技術(shù)以及是否把方法拷貝到子類(lèi)或?qū)嵗校ㄈ艨截悾瑒t增加了數(shù)據(jù)冗余,并且喪失了父類(lèi)更新子類(lèi)也會(huì)自動(dòng)更新的特性,若不拷貝,則每次訪(fǎng)問(wèn)父類(lèi)方法,由于使用元表,都會(huì)代碼額外的開(kāi)銷(xiāo)),下面是一種實(shí)現(xiàn)方法:

clsObject = { __ClassType = "class type" }                                                      function clsObject:Inherit(o)     o = o or {} o.__ClassType = "class type"   o.mt = { __index = o}   setmetatable(o, {__index = self})   return o end  function clsObject:New(...)   local o = {}    setmetatable(o, self.mt)    if o.__init__ then     o:__init__(...)   end    return o end  function clsObject:__init__() end  function clsObject:Destroy() end  function clsObject:GetType()   return "BaseClass" end 

上面,不管在繼承機(jī)制還是實(shí)例化的過(guò)程,都是使用了元表技術(shù),這樣做符合class繼承的思想。另外還上面的實(shí)現(xiàn),還可以實(shí)現(xiàn)工具函數(shù):獲取一個(gè)class的父類(lèi)和判斷一個(gè)class是否是子類(lèi)或是對(duì)象是否改類(lèi)的實(shí)例,代碼如下:

function Super(TmpClass)   return getmetatable(TmpClass).__index end  function IsSub(clsSub, clsAncestor)   local Temp = clsSub   while 1 do     local mt = getmetatable(Temp)     if mt then       Temp = mt.__index       if Temp == clsAncestor then         return true       end      else       return false     end    end  end 

可以按下面實(shí)例代碼來(lái)使用這個(gè)類(lèi)

clsParent = clsObject:Inherit()  function clsParent:Foo()   print("ParentFoo!") end  local ParentObj = clsParent:New() ParentObj:Foo()   clsSon = clsParent:Inherit() function clsSon:Foo()   Super(clsSon).Foo(self)   print("SonFoo") end  local SonObj = clsSon:Inherit() SonObj:Foo()  print(IsSub(clsSon, clsParent)) print(IsSub(clsSon, clsObject)) 

以上所述就是本文的全部?jī)?nèi)容了,希望能夠?qū)Υ蠹沂炀氄莆誰(shuí)ua腳本有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: av电影在线免费 | xxxxhd73国产| 亚洲一区二区三区91 | 欧美国产成人在线 | 久久久久久久久久久高潮一区二区 | 小情侣嗯啊哦视频www | 国产正在播放 | 成人免费在线网 | 中文字幕在线播放一区 | 久久新网址 | 中文字幕在线亚洲 | 色就操| 香蕉久久久久 | 精品一区二区三区免费毛片 | 九艹在线 | 久久精品.com | 亚洲欧美在线视频免费 | 蜜桃免费在线 | 极品大长腿啪啪高潮露脸 | 蜜桃91丨九色丨蝌蚪91桃色 | 久久久久久久久久久高潮一区二区 | 国产91一区二区三区 | 亚洲午夜国产 | 日韩毛片一区二区三区 | 久久久久在线观看 | 91九色精品国产 | 欧美一级黄色片免费观看 | 国产精品免费久久久久 | 成人羞羞在线观看网站 | 3344永久免费 | 国产韩国精品一区二区三区久久 | 国产亚洲精品久久久久久久久久 | 中国av免费观看 | 中文字幕欧美专区 | 可以免费看av| 久久无毛| 国产 视频 一区二区 | 成人在线观看免费观看 | 在线观看一二区 | 国产精品片一区二区三区 | 久久777国产线看观看精品 |