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

Lua通常被描述为具有基于原型的继承(例如在此答案中)。然而,“Lua编程”中的“继承”部分从基于类的继承中提到了“基类”和“超类”等术语。

哪种模型,基于原型还是基于类,最能描述Lua中继承的工作原理?

点赞
用户1009479
用户1009479

Lua 是基于原型的语言。

从技术上讲,Lua 中没有类、继承、基类或者超类。Lua 使用一些工具,例如元表来模拟基于类的面向对象编程。《Programming in Lua》一书中使用这些术语的主要原因是为了方便读者理解。

如果你喜欢类似“语法律师”的方式来描述语法,可以阅读 参考手册,但在那里你将找不到这些术语。

2016-05-02 17:55:12
用户3960399
用户3960399

Lua 的继承系统是基于原型的。首先让我们确保理解 Lua 没有类,而且实际上每个对象都是相同类型的 table。为了模拟类的概念,Lua 使用元表在表上定义一组在表本身上未定义的属性。因为我们可以使用元表“原型化”对象,所以两个表可以共享相同的行为。

table1 = {}
table2 = {}

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

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

table1.myfunction()   --> 10
table2.myfunction()   --> 10

这样,table1table2 具有相同的行为,可以认为它们具有相同的“类”,即使我们只是在两个不同的表上定义了相同的行为。

为了创建继承概念,有许多选项。个人而言,我喜欢创建一个元表,并编程地合并在元表上想“派生”的字段。然后,使用这个新的合并元表,我们可以在新的对象上设置元表。

behavior_derived = {myNewFunction = function() return 20 end}

-- 将基本行为与我们派生的行为合并
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 能够想到的从其他类“派生”“类”的最接近方法。

2016-05-02 19:22:14