原文出處: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 21 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
繼承和多態部分詳見: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
測試代碼如下:
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())
具體結果大家可以自己試試看!