Lua是基于原型还是基于类的继承?

时间:2016-05-02 17:01:28

标签: class inheritance lua prototype

Lua经常被描述为具有基于原型的继承(例如在this answer中)。然而,在{""编程在Lua"谈论"基类"和"超类" - 来自基于类的继承的术语。

哪种模型,基于原型或基于类,最能描述继承在Lua中的工作方式?

2 个答案:

答案 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

通过这种方式,table1table2具有相同的行为,可以被认为具有相同的“类”,即使我们真的只是在两个不同的表上定义了相同的行为。 / 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从我能想到的其他人那里得到“阶级”的最接近的。