lua实现多继承-方式2
生活随笔
收集整理的這篇文章主要介紹了
lua实现多继承-方式2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原理
1. lua的面向對象是基于元表metatable實現的,原理即在一個表中查找不到,就到元表中查找
2. lua的多繼承原理即在一個表中查找不到,則到多個表中進行查詢
代碼示例
----------------------------------------- 基類BaseClass1 ------------------------------------------ -- 類BaseClass1的聲明 BaseClass1 = { } -- 構造函數 function BaseClass1:new()print("BaseClass1:構造函數")-- 新建一個對象,這樣通過BaseClass1:new()函數創建的每一個實例都是獨立的local tempObj = {}-- 設置新對象的metatable,謹記:這一步非常重要setmetatable(tempObj,{__index = BaseClass1})-- 返回這個新創建的對象return tempObj end-- 類的print()函數 function BaseClass1:Print()print("BaseClass1:Print()") end-- 類的特有函數Add() function BaseClass1:Add()print("BaseClass1:Add()") end----------------------------------------- 基類BaseClass2 ------------------------------------------ -- 類BaseClass2的聲明 BaseClass2 = { }-- 構造函數 function BaseClass2:new()print("BaseClass2:構造函數")-- 新建一個對象,這樣通過BaseClass2:new()函數創建的每一個實例都是獨立的local tempObj = {}-- 設置新對象的metatable,謹記:這一步非常重要setmetatable(tempObj,{__index = BaseClass2})-- 返回這個新創建的對象return tempObj end-- 類的print()函數 function BaseClass2:Print()print("BaseClass2:Print()") end-- 類的特有函數Reduce() function BaseClass2:Reduce()print("BaseClass2:Reduce()") end----------------------------------------- 搜索函數 --------------------------------------- -- 非常關鍵的函數(在table list中查找變量key) local function search(key,list)for i=1, table.getn(list) dolocal v = list[i][key]if v thenreturn vendendend----------------------------------------- 子類SubClass ---------------------------------------- local SubClass = { } function SubClass:new()-- 為SubClass設置元表local base = {BaseClass1, BaseClass2}setmetatable(SubClass, {__index= function(table,key) return search(key, base) end})-- 新建一個子類對象,設置元表為SubClasslocal tempObj = {}setmetatable(tempObj, {__index = SubClass})return tempObj end-- 子類的特有函數 function SubClass:SubPrint()print("SubClass:SubPrint()") end---------------------------------------- 下面是測試代碼 ----------------------------------- -- 構造一個子類實例 local SubObj = SubClass:new()-- 訪問子類自己的print()函數, --由于基類1和基類2里面都有Print()函數,會發現,實際訪問的是基類1里面的函數,非常不建議基類中函數/變量名字一樣,容易混淆 SubObj:Print()-- 訪問子類自己的SubPrint()函數 SubObj:SubPrint()-- 訪問基類1的特有函數Add() SubObj:Add()-- 訪問基類2的特有函數Reduce() SubObj:Reduce()測試結果
總結
以上是生活随笔為你收集整理的lua实现多继承-方式2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lua实现多继承-方式1
- 下一篇: 实现lua面向对象的private属性