天天看點

Lua下通過元表模拟OOP程式設計,繼承多态

Lua本身是沒有以明确的定義來支援OOP程式設計的,但是我們卻可以通過Lua核心提供的一些特性來間接實作簡單的面向對象的程式設計。 

通過Lua中的 table結構  metatable 以及函數可以配合實作OOP,以及繼承。這些說白了都是一種僞實作,不建議在Lua下使用多重繼承 。

在LUA中你想要 強制實作OOP 你必須需要懂一下幾個關鍵詞!!

什麼是文法糖?

比如char str[100] ;我通路第一個 字元 我是不是可以這樣    str[1]   *(str+1) 簡化了 代碼編寫 使粘合度 更高 就是一種文法糖。用過c#的人可以發現,C#的文法糖做到了極緻。

什麼是table?

Lua中的結構隻有table,他是基于 HashMap  與索引數組與 一身,能存放任意類型資料,包括函數 何以其他表  這也就是  我們模拟內建的奠定了基礎。

什麼是metable?

local tb={["a"=1]}  這麼一段代碼 ,假如 我print(tb.b) 那麼會提示找不到b, 

這個時候叫做元表的metable 就起作用了,這會觸發lua的 搜尋機制,就去從metatable 中 搜尋 b  這一點是不是和 javascript 的  prototype 類型呢?

這也就是我們實作繼承的基礎

 table中的__index是做什麼用的?

他是一個函數,這個函數告訴Lua解釋器  當在一個table中找不到  相對應元素的時候 如何從 metable 中搜尋元素。

實作OOP

結果如下

Lua下通過元表模拟OOP程式設計,繼承多态

LUA模拟實作繼承

Lua下通過元表模拟OOP程式設計,繼承多态

模拟實作多态

既然繼承我們都實作了 多态我們隻需要在不同的類型中添加不同的定文法糖函數義即可

Lua下通過元表模拟OOP程式設計,繼承多态

參考資料 

http://blog.csdn.net/ym012/article/details/7206968

http://www.xuebuyuan.com/1613223.html

http://blog.csdn.net/xocoder/article/details/9028347

http://www.cnblogs.com/zhiranok/archive/2012/02/07/lua_object_skill.html