Metatable與物件導向 繼承

2021-07-13 13:42:11 字數 1679 閱讀 8702

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的關係,只是建立了乙個層次體系。物件導向的核心是多型。即通過一致的呼叫形式,根據物件的實際型別不同,可以自動完成不同的行為。舉個例子...