青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

每天早晨叫醒你的不是鬧鐘,而是夢想

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  62 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

Lua中的table就是一種對(duì)象,但是如果直接使用仍然會(huì)存在大量的問題,見如下代碼:

1 Account = {balance = 0}
2 function Account.withdraw(v)
3 Account.balance = Account.balance - v
4 end
5 --下面是測試調(diào)用函數(shù)
6 Account.withdraw(100.00)

    在上面的withdraw函數(shù)內(nèi)部依賴了全局變量Account,一旦該變量發(fā)生改變,將會(huì)導(dǎo)致withdraw不再能正常的工作,如:

1 a = Account; Account = nil
2 a.withdraw(100.00) --將會(huì)導(dǎo)致訪問空nil的錯(cuò)誤。

    這種行為明顯的違反了面向?qū)ο蠓庋b性和實(shí)例獨(dú)立性。要解決這一問題,我們需要給withdraw函數(shù)在添加一個(gè)參數(shù)self,他等價(jià)于Java/C++中的this,見如下修改:

1 function Account.withdraw(self,v)
2 self.balance = self.balance - v
3 end
4 --下面是基于修改后代碼的調(diào)用:
5 a1 = Account; Account = nil
6 a1.withdraw(a1,100.00) --正常工作。

    針對(duì)上述問題,Lua提供了一種更為便利的語法,即將點(diǎn)(.)替換為冒號(hào)(:),這樣可以在定義和調(diào)用時(shí)均隱藏self參數(shù),如:

1 function Account:withdraw(v)
2 self.balance = self.balance - v
3 end
4 --調(diào)用代碼可改為:
5 a:withdraw(100.00)


    1. 類:
    Lua在語言上并沒有提供面向?qū)ο蟮闹С郑虼讼雽?shí)現(xiàn)該功能,我們只能通過table來模擬,見如下代碼及關(guān)鍵性注釋:

復(fù)制代碼
 1 --[[
2 在這段代碼中,我們可以將Account視為class的聲明,如Java中的:
3 public class Account
4 {
5 public float balance = 0;
6 public Account(Account o);
7 public void deposite(float f);
8 }
9 --]]
10 --這里balance是一個(gè)公有的成員變量。
11 Account = {balance = 0}
12
13 --new可以視為構(gòu)造函數(shù)
14 function Account:new(o)
15 o = o or {} --如果參數(shù)中沒有提供table,則創(chuàng)建一個(gè)空的。
16 --將新對(duì)象實(shí)例的metatable指向Account表(類),這樣就可以將其視為模板了。
17 setmetatable(o,self)
18 --在將Account的__index字段指向自己,以便新對(duì)象在訪問Account的函數(shù)和字段時(shí),可被直接重定向。
19 self.__index = self
20 --最后返回構(gòu)造后的對(duì)象實(shí)例
21 return o
22 end
23
24 --deposite被視為Account類的公有成員函數(shù)
25 function Account:deposit(v)
26 --這里的self表示對(duì)象實(shí)例本身
27 self.balance = self.balance + v
28 end
29
30 --下面的代碼創(chuàng)建兩個(gè)Account的對(duì)象實(shí)例
31
32 --通過Account的new方法構(gòu)造基于該類的示例對(duì)象。
33 a = Account:new()
34 --[[
35 這里需要具體解釋一下,此時(shí)由于table a中并沒有deposite字段,因此需要重定向到Account,
36 同時(shí)調(diào)用Account的deposite方法。在Account.deposite方法中,由于self(a對(duì)象)并沒有balance
37 字段,因此在執(zhí)行self.balance + v時(shí),也需要重定向訪問Account中的balance字段,其缺省值為0。
38 在得到計(jì)算結(jié)果后,再將該結(jié)果直接賦值給a.balance。此后a對(duì)象就擁有了自己的balance字段和值。
39 下次再調(diào)用該方法,balance字段的值將完全來自于a對(duì)象,而無需在重定向到Account了。
40 --]]
41 a:deposit(100.00)
42 print(a.balance) --輸出100
43
44 b = Account:new()
45 b:deposit(200.00)
46 print(b.balance) --輸出200
復(fù)制代碼


    2. 繼承:
    繼承也是面向?qū)ο笾幸粋€(gè)非常重要的概念,在Lua中我們?nèi)匀豢梢韵衲M類那樣來進(jìn)一步實(shí)現(xiàn)面向?qū)ο笾械睦^承機(jī)制,見如下代碼及關(guān)鍵性注釋:

復(fù)制代碼
 1 --需要說明的是,這段代碼僅提供和繼承相關(guān)的注釋,和類相關(guān)的注釋在上面的代碼中已經(jīng)給出。
2 Account = {balance = 0}
3
4 function Account:new(o)
5 o = o or {}
6 setmetatable(o,self)
7 self.__index = self
8 return o
9 end
10
11 function Account:deposit(v)
12 self.balance = self.balance + v
13 end
14
15 function Account:withdraw(v)
16 if v > self.balance then
17 error("Insufficient funds")
18 end
19 self.balance = self.balance - v
20 end
21
22 --下面將派生出一個(gè)Account的子類,以使客戶可以實(shí)現(xiàn)透支的功能。
23 SpecialAccount = Account:new() --此時(shí)SpecialAccount仍然為Account的一個(gè)對(duì)象實(shí)例
24
25 --派生類SpecialAccount擴(kuò)展出的方法。
26 --下面這些SpecialAccount中的方法代碼(getLimit/withdraw),一定要位于SpecialAccount被Account構(gòu)造之后。
27 function SpecialAccount:getLimit()
28 --此時(shí)的self將為對(duì)象實(shí)例。
29 return self.limit or 0
30 end
31
32 --SpecialAccount將為Account的子類,下面的方法withdraw可以視為SpecialAccount
33 --重寫的Account中的withdraw方法,以實(shí)現(xiàn)自定義的功能。
34 function SpecialAccount:withdraw(v)
35 --此時(shí)的self將為對(duì)象實(shí)例。
36 if v - self.balance >= self:getLimit() then
37 error("Insufficient funds")
38 end
39 self.balance = self.balance - v
40 end
41
42 --在執(zhí)行下面的new方法時(shí),table s的元表已經(jīng)是SpecialAccount了,而不再是Account。
43 s = SpecialAccount:new{limit = 1000.00}
44 --在調(diào)用下面的deposit方法時(shí),由于table s和SpecialAccount均未提供該方法,因此訪問的仍然是
45 --Account的deposit方法。
46 s:deposit(100)
47
48
49 --此時(shí)的withdraw方法將不再是Account中的withdraw方法,而是SpecialAccount中的該方法。
50 --這是因?yàn)長ua先在SpecialAccount(即s的元表)中找到了該方法。
51 s:withdraw(200.00)
52 print(s.balance) --輸出-100
復(fù)制代碼


    3. 私密性:
    私密性對(duì)于面向?qū)ο笳Z言來說是不可或缺的,否則將直接破壞對(duì)象的封裝性。Lua作為一種面向過程的腳本語言,更是沒有提供這樣的功能,然而和模擬支持類與繼承一樣,我們?nèi)匀豢梢栽贚ua中通過特殊的編程技巧來實(shí)現(xiàn)它,這里我們應(yīng)用的是Lua中的閉包函數(shù)。該實(shí)現(xiàn)方式和前面兩個(gè)示例中基于元表的方式有著很大的區(qū)別,見如下代碼示例和關(guān)鍵性注釋:

復(fù)制代碼
 1 --這里我們需要一個(gè)閉包函數(shù)作為類的創(chuàng)建工廠
2 function newAccount(initialBalance)
3 --這里的self僅僅是一個(gè)普通的局部變量,其含義完全不同于前面示例中的self。
4 --這里之所以使用self作為局部變量名,也是為了方便今后的移植。比如,以后
5 --如果改為上面的實(shí)現(xiàn)方式,這里應(yīng)用了self就可以降低修改的工作量了。
6 local self = {balance = initialBalance} --這里我們可以將self視為私有成員變量
7 local withdraw = function(v) self.balance = self.balance - v end
8 local deposit = function(v) self.balance = self.balance + v end
9 local getBalance = function() return self.balance end
10 --返回對(duì)象中包含的字段僅僅為公有方法。事實(shí)上,我們通過該種方式,不僅可以實(shí)現(xiàn)
11 --成員變量的私有性,也可以實(shí)現(xiàn)方法的私有性,如:
12 --local privateFunction = function() --do something end
13 --只要我們不在輸出對(duì)象中包含該方法的字段即可。
14 return {withdraw = withdraw, deposit = deposit, getBalance = getBalance}
15 end
16
17 --和前面兩個(gè)示例不同的是,在調(diào)用對(duì)象方法時(shí),不再需要self變量,因此我們可以直接使用點(diǎn)(.),
18 --而不再需要使用冒號(hào)(:)操作符了。
19 accl = newAccount(100.00)
20 --在函數(shù)newAccount返回之后,該函數(shù)內(nèi)的“非局部變量”表self就不再能被外部訪問了,只能通過
21 --該函數(shù)返回的對(duì)象的方法來操作它們。
22 accl.withdraw(40.00)
23 print(acc1.getBalance())
復(fù)制代碼

    事實(shí)上,上面的代碼只是給出一個(gè)簡單的示例,在實(shí)際應(yīng)用中,我們可以將更多的私有變量存放于上例的局部self表中。

posted on 2014-02-17 17:41 沛沛 閱讀(298) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Script
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美中文在线观看国产| 女人香蕉久久**毛片精品| 欧美三级乱码| 亚洲欧美在线一区二区| 亚洲一区二区黄| 国产色婷婷国产综合在线理论片a| 亚洲一区亚洲| 香蕉亚洲视频| 亚洲激情不卡| 亚洲另类春色国产| 国产精品亚洲综合色区韩国| 久久精品视频亚洲| 久久亚洲二区| 一本色道久久88亚洲综合88 | 国产一区二区三区日韩| 久久精品人人做人人综合| 久久成人免费电影| 亚洲精选中文字幕| 欧美性生交xxxxx久久久| 艳女tv在线观看国产一区| 日韩图片一区| 国产色产综合色产在线视频| 欧美国产专区| 国产精品手机视频| 麻豆久久婷婷| 国产精品扒开腿做爽爽爽软件| 欧美一区二区视频在线| 久久一二三区| 亚洲欧美日韩国产中文| 老司机久久99久久精品播放免费| 日韩一二三区视频| 午夜在线精品偷拍| 99视频日韩| 欧美在线观看视频一区二区三区| 亚洲美女中出| 久久久国产精彩视频美女艺术照福利| 日韩写真视频在线观看| 午夜日韩激情| 亚洲午夜国产一区99re久久 | 欧美**人妖| 国产精品成人v| 欧美福利专区| 国产一区二区三区在线观看网站| 亚洲毛片av| 在线观看91精品国产麻豆| 在线中文字幕一区| 一本久道久久综合狠狠爱| 欧美中文字幕在线观看| 亚洲一区二区三区在线视频| 狼狼综合久久久久综合网 | 一区二区电影免费观看| 久久九九热re6这里有精品 | 亚洲国产一区二区三区高清| 午夜精品一区二区三区四区| 一本色道久久加勒比精品| 久久久久se| 欧美一区视频在线| 国产精品视频久久一区| 99精品国产福利在线观看免费 | 一区二区三区四区精品| 另类成人小视频在线| 久久米奇亚洲| 国产在线精品一区二区夜色| 午夜精品视频一区| 欧美一区二区三区视频在线| 国产精品久久久久久久久免费桃花 | 欧美国产日本| 亚洲高清不卡一区| 久久综合中文| 欧美多人爱爱视频网站| 91久久极品少妇xxxxⅹ软件| 免费欧美高清视频| 欧美国产一区二区在线观看| 亚洲二区在线视频| 欧美xart系列高清| 亚洲国产经典视频| 亚洲欧洲日产国码二区| 欧美精品一级| 99re6这里只有精品视频在线观看| 日韩亚洲国产欧美| 欧美日韩一区二区三| 亚洲一区二区三区四区在线观看| 欧美一级片久久久久久久| 国产精品免费观看视频| 欧美一区二粉嫩精品国产一线天| 久久亚洲免费| 亚洲福利免费| 欧美精品一区二区高清在线观看| 亚洲精品视频在线| 亚洲欧美日本国产专区一区| 国产日产欧产精品推荐色 | 亚洲影院免费| 久久夜色撩人精品| 亚洲另类在线一区| 国产精品久久久久久久久久久久| 性色一区二区三区| 欧美电影在线观看| 亚洲视频免费在线观看| 国产日韩欧美精品| 美日韩免费视频| 在线视频精品一| 久久婷婷人人澡人人喊人人爽| 亚洲国产婷婷综合在线精品| 国产精品国产精品国产专区不蜜| 欧美亚洲三区| 亚洲欧洲三级| 久久久亚洲午夜电影| 亚洲精品中文字| 国产欧美日韩不卡| 欧美日韩 国产精品| 欧美亚洲一区在线| 亚洲人成在线观看网站高清| 久久久www成人免费毛片麻豆| 亚洲精品欧美日韩| 国产一区二区激情| 欧美私人啪啪vps| 鲁大师成人一区二区三区| 中文亚洲欧美| 亚洲国产精品一区二区第四页av| 性做久久久久久免费观看欧美| 最新亚洲激情| 悠悠资源网久久精品| 国产精品久久久久9999高清 | 亚洲欧美激情一区| 亚洲黄色影院| 美女尤物久久精品| 欧美伊人久久久久久久久影院| 一本久道综合久久精品| 亚洲高清av| 国精品一区二区三区| 欧美午夜大胆人体| 欧美乱大交xxxxx| 免费亚洲网站| 久久视频在线免费观看| 欧美一区高清| 午夜精品av| 亚洲男女毛片无遮挡| 99精品欧美一区二区三区综合在线| 免费成人高清在线视频| 久久精品30| 久久久精品国产免大香伊| 欧美亚洲一区二区在线| 亚洲女性裸体视频| 亚洲欧美区自拍先锋| 亚洲新中文字幕| 亚洲理伦在线| 在线中文字幕不卡| 亚洲一区二区三区中文字幕| 一区二区三区精密机械公司| 99re66热这里只有精品3直播| 亚洲精品社区| 中文av一区二区| 亚洲尤物在线视频观看| 亚洲欧美日韩国产另类专区| 午夜精品福利电影| 欧美一区二区黄色| 久久精品国产视频| 蜜桃av综合| 91久久黄色| 一区二区国产日产| 西西裸体人体做爰大胆久久久| 欧美一区二区三区免费观看 | 99国产一区| 亚洲资源在线观看| 欧美亚洲一区二区在线| 久久亚洲欧洲| 欧美伦理影院| 国产精品一区二区三区久久| 国产一区在线播放| 亚洲第一精品夜夜躁人人爽| 999亚洲国产精| 欧美在线一级视频| 欧美刺激性大交免费视频| 亚洲黄色av| 亚洲欧美中文另类| 免费欧美高清视频| 国产精品一区二区在线观看| 国产情人节一区| 亚洲免费观看高清在线观看| 亚洲欧美日韩在线一区| 美女啪啪无遮挡免费久久网站| 亚洲精品久久久一区二区三区| 亚洲亚洲精品在线观看| 久久午夜电影| 国产精品私房写真福利视频| 在线看日韩av| 亚洲自拍偷拍福利| 美女精品一区| 亚洲欧美日韩精品久久奇米色影视 | 亚洲欧美日韩综合| 米奇777超碰欧美日韩亚洲| 国产精品久久久久婷婷| 1024成人网色www| 欧美亚洲免费| 91久久亚洲| 久久久久女教师免费一区| 国产精品久久国产三级国电话系列| 在线播放中文一区| 午夜精品区一区二区三| 91久久久一线二线三线品牌|