Lua實現面向對象兩種方法


1、用元表和元方法

lua面向對象編程是基於元表metatable,元方法__index來實現的
通過元表的__index元方法,將一個table的__index元方法設置為另一個table,那么后者的方法就被前者繼承

如果訪問了lua表中不存在的元素時,就會觸發lua的一套查找機制,也是憑借這個機制,才能夠實現面向對象的
總結元表的查找步驟:
步驟1.在表中查找,如果找到,返回該元素,找不到則繼續步驟2
步驟2.判斷該表是否有元表,如果沒有元表,返回nil,有元表則繼續步驟3
步驟3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是一個表,則重復步驟1、2、3;如果__index方法是一個函數,則調用該函數,並返回該函數的返回值

  • 元表像是一個備用查找表,假設表A的元表是B,那么在A中找不到的東西就會嘗試在B中去找,設置元表的函數如下
  •  setmetatable(A, B),這樣表B就被設置為A的元表,當A中查找不到某個變量時就會到B中進行查找
  • 元方法__index是用來確定一個表在被作為元表時的查找方法
  • 面向對象的封裝

-- 設置新對象的metatable
setmetatable(tempObj,Class)

  • 面向對象的繼承和多態

父類:-- 設置metatable的元方法__index,指向表Class自己
Class.__index = Class
-- 設置新對象的metatable,
setmetatable(tempObj,Class)
子類:-- 設置元表為Class
setmetatable(SubClass, Class)
-- 設置metatable的元方法__index,指向表SubClass自己
SubClass.__index = SubClass

2、直接將基類的成員深拷貝給子類

:對外只有class函數,參數為基類的名稱,返回一個派生類的對象數據。函數的作用是根據傳入的基類,拿到對應的元表來初始化派生類對象的元表,這樣在代碼運行時,不需要動態向上查找,缺陷在於這樣做在對象創建時會消耗更多的時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM