lua也面相對象?不錯,是的。它有物件導向的操作。看看簡單樣本:
CTest = { cnt = 0 }</p><p>function CTest:new(o)<br />o = o or {}<br />setmetatable(o, self)<br />self.__index = self<br />return o<br />end</p><p>function CTest.add(self, v)<br />self.cnt = self.cnt + v<br />end</p><p>function CTest:pprint()<br />print("CTest...")<br />end</p><p>c1 = CTest<br />c1.add(c1, 10)<br />print(c1.cnt)</p><p>c1:add(99)<br />print(c1.cnt)<br />c1:pprint()<br />print("/n")
一般用this或者self指向當前對象。python用習慣了,和python保持一致,用self來表示。lua中,可以用冒號文法省略self參數的傳遞,如上例中 c1:pprint() 等價於 c1.pprint(c1)。
有物件導向的特徵,當然少不了繼承:
DTest = CTest:new()<br />function DTest:pprint()<br />print("DTest...")<br />end</p><p>d1 = DTest:new{cnt = 2009}<br />print(d1.cnt)<br />d1.pprint()<br />print("/n")
DTest繼承自CTest,重寫了pprint方法。
有物件導向的特徵,當然少不了封裝:
function ETest(initCnt)<br />local self = { cnt = initCnt }</p><p>local add = function(v)<br />self.cnt = self.cnt + v<br />end</p><p>local pprint = function()<br />print "ETest ... "<br />end</p><p>return {<br />add = add,<br />pprint = pprint<br />}<br />end</p><p>e1 = ETest(0)<br />e1.pprint()<br />print(e1.cnt) -- 訪問不了 cnt,cnt是私人變數
如果對JavaScript比較瞭解,一看到上面的封裝代碼,覺得儼然是JavaScript風格,並且和JavaScript封裝的行為幾乎一模一樣。