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

Lua中類的實現(xiàn)

 更新時間:2015年04月10日 09:51:18   投稿:hebedich  
Lua中沒有類的概念,但我們可以利用Lua本身的語言特性來實現(xiàn)類。 下文將詳細的解釋在Lua中實現(xiàn)類的原理

概述

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

 實現(xiàn)

 在Lua中要模擬類比較關鍵的地方就是class的繼承機制,以及class實例化的過程,這個過程的主要是用了元表技術以及是否把方法拷貝到子類或?qū)嵗校ㄈ艨截?,則增加了數(shù)據(jù)冗余,并且喪失了父類更新子類也會自動更新的特性,若不拷貝,則每次訪問父類方法,由于使用元表,都會代碼額外的開銷),下面是一種實現(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 

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

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 

可以按下面實例代碼來使用這個類

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

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

相關文章

  • 深入解讀Lua中迭代器與泛型for的使用

    深入解讀Lua中迭代器與泛型for的使用

    在Lua中,迭代器常被寫為函數(shù)而被調(diào)用返回下一個元素,而for循環(huán)調(diào)用迭代器函數(shù)則使得迭代更強強大,下面我們就來深入解讀Lua中迭代器與泛型for
    2016-06-06
  • Lua的協(xié)程(coroutine)簡介

    Lua的協(xié)程(coroutine)簡介

    這篇文章主要介紹了Lua的協(xié)程(coroutine)簡介,本文講解了coroutine的創(chuàng)建、協(xié)程的三種狀態(tài)和yield函數(shù)的配合使用等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua面向?qū)ο笾惡屠^承淺析

    Lua面向?qū)ο笾惡屠^承淺析

    這篇文章主要介紹了Lua面向?qū)ο笾惡屠^承淺析,本文講解了一些Lua面向?qū)ο蟮囊恍┲R,需要的朋友可以參考下
    2014-09-09
  • Lua中的元表(metatable)、元方法(metamethod)詳解

    Lua中的元表(metatable)、元方法(metamethod)詳解

    這篇文章主要介紹了Lua中的元表(metatable)、元方法(metamethod)詳解,本文對它做了詳細講解,并給出實例來說明,需要的朋友可以參考下
    2014-09-09
  • Lua中簡單的錯誤處理實例

    Lua中簡單的錯誤處理實例

    這篇文章主要介紹了Lua中簡單的錯誤處理實例,本文講解了Lua錯誤處理中的error、assert、pcall等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua中使用table.concat連接大量字符串實例

    Lua中使用table.concat連接大量字符串實例

    這篇文章主要介紹了Lua中使用table.concat連接大量字符串實例,本文是Lua處理大量字符串的一個測試文章,測試了2種方法處理大量字符串的消耗時間,需要的朋友可以參考下
    2014-09-09
  • Lua與C語言間的交互實例

    Lua與C語言間的交互實例

    這篇文章主要介紹了Lua與C語言間的交互實例,本文主要講解了Lua中調(diào)用C語言的方法和例子,需要的朋友可以參考下
    2014-12-12
  • Lua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規(guī)范、全局變量、類型與值等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua中操作字符串的基本方法整理

    Lua中操作字符串的基本方法整理

    這篇文章主要介紹了Lua中操作字符串的基本方法整理,是Lua入門學習中的基礎知識,需要的朋友可以參考下
    2015-05-05
  • 分析Lua觀察者模式最佳實踐之構(gòu)建事件分發(fā)系統(tǒng)

    分析Lua觀察者模式最佳實踐之構(gòu)建事件分發(fā)系統(tǒng)

    當對象間存在一對多關系時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知依賴它的對象。觀察者模式屬于行為型模式
    2021-06-06

最新評論

潼南县| 三亚市| 逊克县| 鹤壁市| 崇信县| 方正县| 乐东| 康马县| 富裕县| 青铜峡市| 古交市| 永川市| 大关县| 穆棱市| 呼玛县| 宁都县| 当涂县| 丰宁| 海丰县| 汝城县| 五指山市| 阳朔县| 芜湖县| 田阳县| 佛冈县| 鄂托克旗| 黔西县| 如东县| 周口市| 红桥区| 荣成市| 新晃| 乳山市| 惠水县| 瓦房店市| 安庆市| 阳朔县| 墨竹工卡县| 嘉义市| 辽源市| 岢岚县|