This question already has answers here:
Inheritance for metamethods in Lua
(3 个回答)
5年前关闭。
我正在尝试在 Lua 中实现简单的继承,因为它在 PIL 16.2 中呈现。然而,我遇到了一个令人惊讶的行为:元方法似乎没有被继承。在以下示例中,我使用
我期待 Lua 会在
为什么这不起作用,实际发生了什么,以及(如果这是正确的行为,而不仅仅是我的错误)我如何在 Lua 中实现可继承的元方法?
(3 个回答)
5年前关闭。
我正在尝试在 Lua 中实现简单的继承,因为它在 PIL 16.2 中呈现。然而,我遇到了一个令人惊讶的行为:元方法似乎没有被继承。在以下示例中,我使用
x
和 y
成员创建了一个 Point 类,并为其提供了一个 __add
元方法。添加 Point 的实例时,一切正常,但如果我创建一个子类并添加它的实例,则会出现错误。Point = {}
function Point:new(x, y)
local point = {}
setmetatable(point, self)
self.__index = self
point.x = x or 0
point.y = y or 0
return point
end
Point.__add = function(a, b)
return Point:new(a.x + b.x, a.y + b.y)
end
p = Point:new(2,2)
r1 = p + p
print(p.x, p.y) -- prints "4 4" as expected
ChildPoint = Point:new()
c = ChildPoint:new()
r2 = c + c -- Error: attempt to perform arithmetic on a table value (local 't1')
print(r.x, r.y)
我期待 Lua 会在
__add
中寻找 ChildPoint
,这会触发 ChildPoint
的 __index
,在 __add
中找到 Point
。但这似乎不会发生。为什么这不起作用,实际发生了什么,以及(如果这是正确的行为,而不仅仅是我的错误)我如何在 Lua 中实现可继承的元方法?
最佳答案
正如 Egor 解释的那样,在这种情况下需要显式复制元方法;有关相同问题和可能解决方案的讨论,请参阅较早的 SO question(选定的一个复制元方法)。
关于oop - Lua 继承不包括元方法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36229151/
10-13 07:11