仅对LUA中的特定实例覆盖功能

时间:2019-02-08 12:09:29

标签: function object lua override overwrite

我基本上不需要寻找有关如何做某事的答案,但我找到了如何做,但还需要更多信息。希望这种问题在这里可以。 由于我只是发现了这个代码,所以我不知道该怎么用Google搜索。

在Lua中,我可以举例如:

Account = {balance = 0}
function Account.withdraw (v)
     self.balance = self.balance - v
end

我可以拥有(在另一个lua文件中)

function Account.withdrawBetter (v)
    if self.balance > v then 
      self.balance = self.balance - v
    end
end

... -在某些功能中的某处,带有一个Account实例: a1.withdraw = a1.withdrawBetter `

此“技术”的名称是什么,以便我可以找到有关它的更多信息(可能的陷阱,性能注意事项与覆盖/覆盖等)?注意我仅针对特定实例(a1)而不是每个Account实例更改withdraw

奖金问题:还有其他具有这种功能的oo编程语言吗?

谢谢

1 个答案:

答案 0 :(得分:1)

Lua中的OO

首先,应该指出的是Lua并没有实现面向对象的编程。它没有对象,类,继承等概念。

如果要在Lua中使用OOP,则必须自己实现。通常,这是通过创建一个充当“类”的表并存储“实例方法”来完成的,这些方法实际上只是将实例作为其第一个参数的函数。

然后通过让“构造函数”(也只是一个函数)创建一个新表并通过指向类表的__index字段将其元表设置为一个来实现继承。当使用没有索引的键为“实例”建立索引时,它将在类中搜索该键。

换句话说,“实例”表可能根本没有任何功能,但是用例如"withdraw"进行索引将只是尝试为该类建立索引。

现在,如果我们使用一个“实例”表并向其中添加一个withdraw字段,Lua将看到它具有该字段,而不必费心在类中查找它。您可以说该值阴影是类表中的值。

此“技术”的名称是什么

它实际上没有一个,但是您绝对应该研究元表。

在支持 的语言中,例如在Ruby中(见下文),通常使用单例类来完成,这意味着它们只有一个实例。

性能注意事项

索引表(包括元表)需要一些时间。如果Lua在实例表中找到一个方法,那么这就是单个表查找;如果没有,则需要首先获取它的元表和索引,如果它既不具有元表又具有自己的元表,则链将继续这样。

因此,换句话说,这实际上是更快。它确实占用了更多的空间,但实际上并没有占用太多空间(从技术上来说可能会很多,但是您实际上不必为此担心。尽管如此,here's where you can read up on that,如果您愿意)。

还有其他具有这种功能的oo编程语言吗?

是的,很多。 Ruby是一个很好的例子,您可以在其中做类似的事情

array1 = [1, 2, 3]
array2 = [4, 5, 6]

def array1.foo
  puts 'bar'
end

array1.foo # prints 'bar'
array2.foo # raises `NoMethodError`