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

Class Lua中的继承是基于原型还是基于类?,class,inheritance,lua,prototype,Class,Inheritance,Lua,Prototype,Lua通常被描述为具有基于原型的继承(例如在中)。然而,“Lua中的编程”一词谈论的是“基类”和“超类”——来自基于类的继承的术语 基于原型还是基于类,哪个模型最能描述继承在Lua中的工作方式?Lua是基于原型的 从技术上讲,Lua中没有类、继承或基类、超类。Lua有一些工具,比如元表来模拟经典的OOP。PiL书使用这些术语的主要原因是为了让读者更容易理解 如果您喜欢描述语法的语言方式,请阅读,您在那里找不到这些术语。Lua有一个。让我们首先确保我们了解Lua没有类,实际上每个对象都是相同类型的

Lua通常被描述为具有基于原型的继承(例如在中)。然而,“Lua中的编程”一词谈论的是“基类”和“超类”——来自基于类的继承的术语


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

Lua是基于原型的

从技术上讲,Lua中没有类、继承或基类、超类。Lua有一些工具,比如元表来模拟经典的OOP。PiL书使用这些术语的主要原因是为了让读者更容易理解

如果您喜欢描述语法的语言方式,请阅读,您在那里找不到这些术语。

Lua有一个。让我们首先确保我们了解Lua没有类,实际上每个对象都是相同类型的(
table
)。为了模仿类的概念,lua使用元表在表上定义一组未在表本身上定义的属性。两个表可以共享相同的行为,因为我们可以用元表“原型化”对象

table1 = {}
table2 = {}

behavior = {myfunction = function() return 10 end}

setmetatable(table1, behavior)
setmetatable(table2, behavior)

a.myfunction()   --> 10
b.myfunction()   --> 10
通过这种方式,
table1
table2
具有相同的行为,可以被认为具有相同的“类”,即使我们实际上只是在两个不同的表上定义了相同的行为

要创建继承的概念,有很多选择。就我个人而言,我喜欢创建一个元表的想法,我想从中“派生”。然后,使用这个新的合并元表,我们可以在新对象上设置元表

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最接近于从我能想到的其他人那里派生“类”的地方。

Lua没有“继承”或“类”。但在Lua中模仿它是可能的。只要做一点额外的工作,就可以将Lua表当作类来对待。不要担心要贴什么标签。只要学习元表如何工作的实际机制。在上面贴上一个或另一个标签对你没有帮助。