覆盖功能仅适用于LUA特定实例

问题描述 投票:2回答:1

我基本上不看关于如何做一个答案,但我发现如何做到这一点,还需要更多的信息。希望这类的问题是确定在这里。因为我刚刚发现这个游戏,我改装我没有什么要我谷歌任何想法的代码。

在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

.... --somewhere在一些功能,与客户实例:a1.withdraw = a1.withdrawBetter`

对于这种“技术”叫什么名字,所以我能找到一些关于它的详细信息(与覆盖可能存在的缺陷,性能方面的考虑/覆盖等)?请注意,我只改变withdraw的特定实例(A1),而不是为每个帐户实例。

奖金的问题:这样的设施任何其他面向对象的编程语言?

谢谢

function object lua override overwrite
1个回答
1
投票

OO在Lua

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

如果您在Lua要OOP,你必须自己实现它。通常,这是通过创建作为“类”,存储“实例方法”,这是真正的接受实例作为第一个参数功能表来完成。

继承然后由具有“构造”(也只是一个函数)创建一个新表,并设置其元表到一个与__index场指向类表来实现的。当索引“实例”它没有一个按键,它就会搜索在类,而不是这把钥匙。

换句话说,“实例”表可能根本没有的功能,但是,它的索引例如,"withdraw"将只是尝试索引类代替。

现在,如果我们采取单一的“实例”表和withdraw字段添加到它,Lua中会看到它有一个领域,而不是打扰班上寻找它。可以说,该值阴影的一个类表中。

叫什么名字这个“术”

它并没有真正有一个,但你绝对应该看看元表。

在Ruby中不支持这样的事情,像语言(见下文),这是经常与单班完成的,这意味着他们只有一个实例。

性能注意事项

索引表,包括元表需要一定的时间。如果发现的Lua在实例表的方法,那么这是一个单表查询;如果没有,那么它需要首先得到的元表和索引相反,如果不具备,要么并拥有自己的元表,链继续这样。

因此,换句话说,这实际上要快。但它确实使用了一些更多的空间,但不是真的那么多(从技术上讲它可能是相当多的,但你真的不应该担心。不过,here's where you can read up on that,如果你愿意的话)。

任何其他的面向对象的编程语言有这样的设施?

是的,很多他们。 Ruby是一个很好的例子,在那里你可以这样做

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

def array1.foo
  puts 'bar'
end

array1.foo # prints 'bar'
array2.foo # raises `NoMethodError`
© www.soinside.com 2019 - 2024. All rights reserved.