我很努力地理解metatables是如何工作的以及爲什麼他們需要在Lua中創建類和繼承。我爲Lua找到的每個OOP示例都與上一次有所不同,但它們始終使用metatables,特別是對於__index
屬性。下面是我如何實現一些簡單的繼承:用於面向對象的Lua(5.2)中的metatables有什麼用途?
Animal = {}
function Animal.New()
local self = {}
self.sName = "Generic Animal"
self.GetName = function(self)
return self.sName
end
self.Speak = function(self)
-- Do nothing, abstract function
end
return self
end
Dog = {}
function Dog.New()
local self = Animal.New()
self.sName = "Dog"
self.Speak = function(self)
print("Bark!")
end
return self
end
Labrador = {}
function Labrador.New()
local self = Dog.New()
self.sName = "Labrador"
return self
end
Chihuahua = {}
function Chihuahua.New()
local self = Dog.New()
self.sName = "Chihuahua"
self.Speak = function(self)
print("Yap yap!")
end
return self
end
-- Test --
l = Labrador.New()
print(l:GetName())
l:Speak()
c = Chihuahua.New()
print(c:GetName())
c:Speak()
d = Dog.New()
print(d:GetName())
d:Speak()
a = Animal.New()
print(a:GetName())
a:Speak()
輸出:
Labrador
Bark!
Chihuahua
Yap yap!
Dog
Bark!
Generic Animal
所以就我所看到的,這工作得很好。如何使用metatables改進我的設計?
你有沒有讀過Lua編程的第13章和第16章,它給出了我所知道的最好的解釋。在線版本爲5.0,但我認爲基本原理仍然是一樣的。 http://www.lua.org/pil/13.html – 2013-02-12 17:09:17
我在Google搜索中沒有遇到特定章節(13)。這對於更好地理解metatables非常有幫助。謝謝。 – 2013-02-13 13:10:07