lua面向?qū)ο髮崿F(xiàn)的(記)

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的學習還要加油!!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,868評論 18 139
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,509評論 0 17
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,754評論 18 399
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,762評論 0 9
  • 乘了22小時的火車,終于在16號下午四點二十八分到大青島站。到達時,青島是陰天,空氣很濕潤,感覺很涼爽,身體也很潮...
    阿盟果果閱讀 257評論 0 0