lua实现多继承-方式1
生活随笔
收集整理的這篇文章主要介紹了
lua实现多继承-方式1
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原理
1. lua的面向?qū)ο笫腔谠韒etatable實現(xiàn)的,原理即在一個表中查找不到,就到元表中查找
2. lua的多繼承原理即在一個表中查找不到,則到多個表中進行查詢
代碼示例
----------------------------------------- 基類BaseClass1 ------------------------------------------ -- 類BaseClass1的聲明 BaseClass1 = {x = 0 }-- 設置metatable的元方法__index,指向表BaseClass1自己 BaseClass1.__index = BaseClass1-- 構造函數(shù) function BaseClass1:new(x)print("BaseClass1:構造函數(shù),x = "..x)-- 新建一個對象,這樣通過BaseClass1:new()函數(shù)創(chuàng)建的每一個實例都是獨立的local tempObj = {}tempObj.x = x-- 設置新對象的metatable,謹記:這一步非常重要setmetatable(tempObj,BaseClass1)-- 返回這個新創(chuàng)建的對象return tempObj end-- 類的print()函數(shù) function BaseClass1:Print()print("BaseClass1:Print() x = "..self.x) end-- 類的特有成員函數(shù) function BaseClass1:Add_X(v)print("BaseClass1:Add_X()")self.x = self.x + v end ----------------------------------------- 基類BaseClass2 ------------------------------------------ -- 類BaseClass2的聲明 BaseClass2 = {y = 0 }-- 設置metatable的元方法__index,指向表BaseClass2自己 BaseClass2.__index = BaseClass2-- 構造函數(shù) function BaseClass2:new(y)print("BaseClass2:構造函數(shù),y = "..y)-- 新建一個對象,這樣通過BaseClass2:new()函數(shù)創(chuàng)建的每一個實例都是獨立的local tempObj = {}tempObj.y = y-- 設置新對象的metatable,謹記:這一步非常重要setmetatable(tempObj,BaseClass2)-- 返回這個新創(chuàng)建的對象return tempObj end-- 類的print()函數(shù) function BaseClass2:Print()print("BaseClass2:Print() y = "..self.y) end-- 類的特有成員函數(shù) function BaseClass2:Reduce_Y(v)print("BaseClass2:Reduce_Y()")self.y = self.y - v end----------------------------------------- 搜索函數(shù) ----------------------------------------- 非常關鍵的函數(shù)(在table list中查找變量key) local function search(key,list)for i=1, table.getn(list) dolocal v = list[i][key]if v thenreturn vendendend----------------------------------------- 子類SubClass --------------------------------------- -- 子類SubClass的聲明,這里又聲明了一個新的變量z SubClass = {z = 0 }-- 設置metatable的元方法__index,指向表SubClass自己 SubClass.__index = SubClass-- 構造函數(shù) function SubClass:new(x,y,z)print("SubClass:構造函數(shù):SubClass,x = "..x..",y = "..y..",z = "..z)-- 創(chuàng)建一個基類1的對象local base1 = BaseClass1:new(x)-- 創(chuàng)建一個基類2的對象local base2 = BaseClass2:new(y)-- 創(chuàng)建一個子類的對象local tempObj = {}tempObj.z = z-- 將該對象的元表指向SubClasssetmetatable(tempObj,SubClass)-- 查找表的集合local baseClass = {base1, base2}-- SubClass的元表最終指向兩個基類setmetatable(SubClass,{__index = function(table,key) return search(key, baseClass) end})return tempObj end-- 定義一個子類特有的print()函數(shù) function SubClass:SubPrint()print("SubClass:SubPrint() x = "..self.x..", y = "..self.y..", z = "..self.z) end---------------------------------------- 下面是測試代碼 ----------------------------------- -- 構造一個子類實例 local SubObj = SubClass:new(1,2,3)-- 訪問子類自己的print()函數(shù), --由于基類1和基類2里面都有Print()函數(shù),會發(fā)現(xiàn),實際訪問的是基類1里面的函數(shù),非常不建議基類中函數(shù)/變量名字一樣,容易混淆 SubObj:Print()-- 訪問子類自己的print()函數(shù) SubObj:SubPrint()-- 訪問基類1的特有函數(shù)Add_X() SubObj:Add_X(10)-- 訪問子類自己的print()函數(shù),檢測結果 SubObj:SubPrint()-- 訪問基類2的特有函數(shù)Reduce_Y SubObj:Reduce_Y(10)-- 訪問子類自己的print()函數(shù),檢測結果 SubObj:SubPrint()測試結果
總結
以上是生活随笔為你收集整理的lua实现多继承-方式1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lua的面向对象编程,封装,继承,多态的
- 下一篇: lua实现多继承-方式2