我试图在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中实现可继承的元方法?