我們的物件目前有了標識,狀態和對狀態進行的操作,但還缺乏類體系、繼承和私有性。
大多數物件導向語言提供了類的概念,類在物件的建立中扮演了模子的作用。在這些語言中,每個物件都是某個特定類的例項(instance)。lua語言中沒有類的概念;雖然元表的概念在某種程度上與類的概念相似,但是把元表當做類使用在後續會比較麻煩。相反,我們可以參考基於原型的語言中的一些做法來在lua語言中模擬類,例如self語言。在這些語言中,物件不屬於類。相反,每個物件可以有乙個原型(prototype)。原型也是一種普通的物件,當物件遇到乙個未知操作時會首先在原型中查詢。要在這種語言中表示乙個類,我們只需要建立乙個專門被用作其他物件的原型物件即可。類和原型都是一種組織多個物件間共享行為的方式。
如果有兩個物件a和b,要讓b成為a的乙個原型,
setmetatable(a, )
在此之後,a就會在b中查詢所有它沒有的操作。
local mt =
function account.new (o)
o = o or {}
setmetatable(o, mt)
return o
enda = account.new
a:deposit(100.00)
當我們建立乙個新賬戶a時,a會將mt作為其元素。當呼叫a:deposit(100.00)時,實際上呼叫的是a.deposit(a, 100.00),冒號只不過是語法糖。因為lua語言無法在表a中找到字段「」deposit」,所以它會在元表的__index中搜尋。
getmetatable(a).__index.deposit(100.00)
a的元表是mt,而mt.__index是account。
對於這種模式,我們可以進行兩個改進。第一種改進是,不建立扮演元表角色的新錶而是把錶account直接用作元表。第二種改進是, 對new方法也是用冒號語法
function account:new(o)
o = o or {}
self.__index = slef
setmetatable(o, self)
return o
end
繼承不僅可以作用於方法,還可以作用於其他在新賬戶中沒有的字段。
b = account:new()
print(b.balance) --> 0
GNU make manual 翻譯 四十五
繼續翻譯 if you want make to simply ignore a makefile which does not exist or cannot be remade,with no error message,use the include directive instead of ...
JavaScript學習筆記 四十五 策略
策略模式能夠讓你在執行時選擇演算法。你的 使用者可以處理相同的介面但可以從一些可用的演算法中挑選演算法去處理他們具體的任務,依賴於他們打算做什麼的環境。乙個使用策略模式的示例將是處理表單驗證。你可以通過validate 方法建立乙個驗證器 validator 物件,這個方法將會被呼叫,不管表單的具體...
安全駕駛 選車 四十五
駕駛安全,我認為人為因素佔50 車輛因素佔50 如何選車呢?1 租車更有意思,想開什麼車,就去租什麼車,2011 年冬天,去穿越小興安嶺,租了兩輛嶄新的越野車,還沒出磨合期,在雪地裡盡情撒歡。絕大多數人接受不了租車,是因為有心理障礙,總想擁有。其實,換個角度就想通了,我們自己買的車,早晚還要賣掉,不...