Lua的類實現繼承、多態以及setmetatable方法

原文出處:http://blog.csdn.net/ym012/article/details/7206968


1,Lua類實現

從網上搜了幾個類實現,自己照貓畫老虎的弄個如下:

ClassYM = {x=0,y=0}  
--這句是重定義元表的索引,必須要有,  
ClassYM.__index = ClassYM   
  
--模擬構造體,一般名稱爲new()  
function ClassYM:new(x,y)  
        local self = {}     
        setmetatable(self, ClassYM)   --必須要有  
        self.x = x     
        self.y = y  
        return self    
end  
  
function ClassYM:test()  
    print(self.x,self.y)  
end  
  
objA = ClassYM:new(1,2)  
objA:test()  
print(objA.x,objA.y)  


運行結果如下:

1 2
1 2

print(objA:x,objA:y)會報錯,調用ojbA.test也會報錯,W?

調用

objA = ClassYM:new(1,2)


objA = ClassYM:new(1,2)
再調用objA.test()時結果如下:

2 0

如調用

objA = ClassYM:new(self,1,2)



再調用objA.test()時結果如下:

1 2

lua提供了用冒號的方式在一個方法定義中添加一個額外的參數,這個參數就是self,這句話可以不理解,但是要勞記!

繼承和多態部分詳見:http://www.soyomaker.com/forum.php?mod=viewthread&tid=230

2,繼承

首先,類的定義

--聲明瞭新的屬性Z  
Main = {z=0}  
--設置類型是Class  
setmetatable(Main, Class)  
--還是和類定義一樣,表索引設定爲自身  
Main.__index = Main  
--這裏是構造體,看,加上了一個新的參數  
function Main:new(x,y,z)  
   local self = {}  --初始化對象自身  
   self = Class:new(x,y) --將對象自身設定爲父類,這個語句相當於其他語言的super  
   setmetatable(self, Main) --將對象自身元表設定爲Main類  
   self.z= z --新的屬性初始化,如果沒有將會按照聲明=0  
   return self  
end  
--定義一個新的方法  
function Main:go()  
   self.x = self.x + 10  
end  
--重定義父類的方法  
function Main:test()  
    print(self.x,self.y,self.z)  
end  


--聲明瞭新的屬性Z
Main = {z=0}
--設置類型是Class
setmetatable(Main, Class)
--還是和類定義一樣,表索引設定爲自身
Main.__index = Main
--這裏是構造體,看,加上了一個新的參數
function Main:new(x,y,z)
   local self = {}  --初始化對象自身
   self = Class:new(x,y) --將對象自身設定爲父類,這個語句相當於其他語言的super
   setmetatable(self, Main) --將對象自身元表設定爲Main類
   self.z= z --新的屬性初始化,如果沒有將會按照聲明=0
   return self
end
--定義一個新的方法
function Main:go()
   self.x = self.x + 10
end
--重定義父類的方法
function Main:test()
    print(self.x,self.y,self.z)
end
測試代碼如下:

c = Main:new(20,40,100)  
c:test()  
d = Main:new(10,50,200)  
d:go()  
d:plus()  
d:test()  
c:test()  


c = Main:new(20,40,100)
c:test()
d = Main:new(10,50,200)
d:go()
d:plus()
d:test()
c:test()

3,多態

Class = {x=0,y=0}  
Class.__index = Class  
function Class:new(x,y)  
        local self = {}  
        setmetatable(self, Class)  
        self.x = x  
        self.y = y  
                     return self  
end  
function Class:test()  
    print(self.x,self.y)  
end  
--新定義的一個函數gto()  
function Class:gto()  
   return 100  
end  
--這裏會引用gto()  
function Class:gio()  
   return self:gto() * 2  
end  
function Class:plus()  
    self.x = self.x + 1  
        self.y = self.y + 1  
end  

再者,繼承部分代碼如下:

Main = {z=0}  
setmetatable(Main, Class)  
Main.__index = Main  
function Main:new(x,y,z)  
   local self = {}  
   self = Class:new(x,y)  
   setmetatable(self, Main)  
   self.z= z  
   return self  
end  
--重新定義了gto()  
function Main:gto()  
   return 50  
end  
function Main:go()  
   self.x = self.x + 10  
end  
function Main:test()  
    print(self.x,self.y,self.z)  
end  


測試代碼如下:

a = Class:new(10,20)  
print(a:gio())  
d = Main:new(10,50,200)  
print(d:gio())  
print(a:gio())  


具體結果大家可以自己試試看! 
發佈了123 篇原創文章 · 獲贊 80 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章