国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Lua中類的實現

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

概述

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

 實現

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

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繼承的思想。另外還上面的實現,還可以實現工具函數:獲取一個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)) 

以上所述就是本文的全部內容了,希望能夠對大家熟練掌握lua腳本有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临城县| 准格尔旗| 丰台区| 祁门县| 札达县| 浠水县| 于都县| 伊金霍洛旗| 兴义市| 剑河县| 河曲县| 武夷山市| 胶南市| 五莲县| 金山区| 江北区| 宁南县| 延津县| 工布江达县| 贵德县| 尉氏县| 建平县| 龙南县| 团风县| 湾仔区| 天峻县| 徐闻县| 莱州市| 镇赉县| 邵东县| 松溪县| 湖北省| 太仆寺旗| 安顺市| 胶南市| 南昌县| 南涧| 开原市| 博乐市| 志丹县| 泗阳县|