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