我很努力地理解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