Lua经常被描述为具有基于原型的继承(例如在this answer中)。然而,在{""编程在Lua"谈论"基类"和"超类" - 来自基于类的继承的术语。
哪种模型,基于原型或基于类,最能描述继承在Lua中的工作方式?
答案 0 :(得分:4)
Lua是基于原型的。
从技术上讲,Lua中没有 class 或继承或基类,超类。 Lua有一些像metatables这样的工具来模拟经典的OOP。 PiL书使用这些术语的主要原因是让读者更容易理解。
如果您喜欢语言 - 律师描述语法的方式,请阅读the reference manual,您将无法在那里找到这些术语。
答案 1 :(得分:2)
Lua有一个prototype-based inheritance system。让我们首先确保我们理解Lua没有类,并且实际上每个对象都是相同的类型(table
)。为了模仿类的概念,lua使用元表来定义表上没有在表本身上定义的一组属性。两个表可以共享相同的行为,因为我们可以使用metatable“原型化”对象。
table1 = {}
table2 = {}
behavior = {myfunction = function() return 10 end}
setmetatable(table1, behavior)
setmetatable(table2, behavior)
a.myfunction() --> 10
b.myfunction() --> 10
通过这种方式,table1
和table2
具有相同的行为,可以被认为具有相同的“类”,即使我们真的只是在两个不同的表上定义了相同的行为。 / p>
要创建继承概念,有很多选项。就个人而言,我喜欢创建一个metatable的想法,以及我想要“衍生”的programmatically merging the fields on the metatables。然后,使用这个新的合并元数据,我们可以在新对象上设置元表。
behavior_derived = {myNewFunction = function() return 20 end}
-- merge the base behavior in with our derived behavior
for k,v in pairs(behavior) do behavior_derived[k] = v end
a_derived = {}
b_derived = {}
setmetatable(a_derived, behavior_derived)
setmetatable(b_derived, behavior_derived)
a_derived.myfunction() --> 10
a_derived.myNewFunction() --> 20
b_derived.myfunction() --> 10
b_derived.myNewFunction() --> 20
这是Lua从我能想到的其他人那里得到“阶级”的最接近的。