Lua中實現(xiàn)面向?qū)ο笥玫氖窃淼臋C制梗肝,元表與表是不同的個體,創(chuàng)建table時铺董,不會自動創(chuàng)建元表巫击。不過任何的表都可以有元表。
setmetatable(table1,table2):table2會做為table1的元表精续,同時有一個返回值table1.
__index方法坝锰,這個是元表中的元方法,它有回溯的功能重付,可以查找table中的屬性顷级,找不到相關(guān)屬性會返回nil.找到就會返回相應(yīng)的值。
__index的值可以是一個方法确垫,也可以是一個表弓颈,表又可能具有表有的特性帽芽。
寫下實現(xiàn)面向?qū)ο蟮乃悸罚?br>
首先是類的特點节腐,繼承坐漏。
我們可以先定義一個父類Parent
Parent = {
x = 10,
y = 20
}
function Parent( t )
{
local t = t or {}
self.__index = self
setmetatable( t, self )
return tend
}
Parent有兩個屬性围段,new方法是實例出一個對象密幔,這個對象同時也是個類恃慧,為什么呢周荐?我們分析一下:
1.把元方法指向自己
self.__index = self
2.設(shè)置元表也是自身
setmetatable( t, self )
3.最后返回這個對象
return t
我們可以先試驗證一下
Child = Parent:new()
print(Child.x)
--10
我們得到一個對象Child城丧,Child訪問變量x,在自身找不到變量宛篇,Child就會去元表里查找有沒有值计福,找到就會去找元方法的引用跌捆,此時到達(dá)Parent,Parent里有x,就返回x的值象颖,但是Child里是沒有x,系統(tǒng)就會構(gòu)造一個變量來接收Parent的x,這樣Child自身雖然沒有x這個變量佩厚,但是他還是能通過元表與元方法得到Parent的x值,這不正是繼承了嗎说订?
同時抄瓦,Child也是一個類,因為在new的時候陶冷,Child也返回了一個指向身的原型钙姊,所以Child也有Parent的功能,所以我們可以這樣訪問:
Child2 = Child2.new()
print(Child2.x)
--10
這樣我們就能實現(xiàn)一條長長的繼承鏈
我們還可以在子類覆蓋父類的方法與成員變量埂伦,也就是重載煞额,這個其實很簡單了,我們已經(jīng)實現(xiàn)繼承就好辦了直接上代碼:
Child2 = Child2.new()
self.x = 20
print(Child2.x)
--20
直接更改賦值就行沾谜。
Lua的靈活與強大難以致信膊毁,對Lua的學(xué)習(xí)還要加油!基跑!