lua是個面向過程的語言, 但通過metatable可以模擬出物件導向的樣子. 其關鍵就在於__index這個域. 他提供了表的索引值入口. 這很像重寫c#中的索引器, 當表要索引乙個值時如table[key], lua會首先在table本身中查詢key的值, 如果沒有並且這個table存在乙個帶有__index屬性的metatable, 則lua會按照__index所定義的函式邏輯查詢. 仔細想想, 這不正為物件導向中的核心思想繼承, 提供了實現方式麼. lua中實現物件導向的方式非常多, 但無論哪種都離不開__index.
local bb =
function bb:new()
b = {}
self.__index = self--改變自己的索引值入口
setmetatable(b, self)--將b的索引值入口設成self,即(local bb = )
return b
endlocal ostrich = bb:new()
print(ostrich.cancry)
另外乙個教程:
person={}
function person:new(p)
local obj = p
if (obj == nil) then
obj =
endself.__index = self--是怕self被擴充套件後改寫,所以,讓其保持原樣
return setmetatable(obj, self)--返回第乙個引數
endfunction person:tostring()
return self.name .." : ".. self.age .." : ".. (self.handsome and "handsome" or "ugly")
end
上面我們可以看到有乙個new方法和乙個tostring的方法。其中:
1)self 就是 person,person:new(p),相當於person.new(self, p)
2)new方法的self.__index = self 的意圖是怕self被擴充套件後改寫,所以,讓其保持原樣
3)setmetatable這個函式返回的是第乙個引數的值。
於是:我們可以這樣呼叫:
me = person:new()
print(me:tostring())
kf = person:new
print(kf:tostring())
繼承:
student = person:new()
function student:new()
newobj =
self.__index = self
return setmetatable(newobj, self)
endfunction student:tostring()
return "student : ".. self.year.." : " .. self.name
end
student = student:new()
print(student:tostring())
物件導向過程與物件導向
物件導向過程與物件導向 1 程式的發展經歷了兩個階段 面向過程 物件導向。2 對於物件導向與面向過程可以用乙個例子解釋,如乙個木匠要做乙個盒子,那麼這個盒子的出發點會有兩種方式 物件導向 先想好要做的盒子,之後在去找相應的工具去做。面向過程 不去想要做什麼樣的盒子,隨需取工具。物件導向三大特徵 封裝...
物件導向方法與物件導向測試
物件導向 object oriented,oo 方法認為,客觀世界是由各種物件組成的,任何事物都是物件,每乙個物件都有自己的運動規律和內部狀態,都屬於某個物件類,是該物件類的乙個元素。複雜的物件可由相對簡單的各種物件以某種方式而構成,不同物件的組合及相互作用就構成了系統。oo方法是當前的主流開發方法...
物件導向與基於物件 面向IO
物件導向和基於物件都有封裝 繼承。區別在於多型。基於物件是一種adt abstract data type 它封裝了一些複雜的操作,使之易於使用。繼承僅僅顯示了is a的關係,只是建立了乙個層次體系。物件導向的核心是多型。即通過一致的呼叫形式,根據物件的實際型別不同,可以自動完成不同的行為。舉個例子...