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就會去元表里查找有沒有值,找到就會去找元方法的引用,此時到達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的學習還要加油!!