Lua 中继承的对象共享相同的表属性

我想在 Lua 中构建一个简单的继承层次结构。BaseClass 有两个属性,一个单值 val 和一个表 vals。如果我创建两个 SubClass 的对象 foobar 并改变这两个属性,那么 val 的更改结果符合预期,但对于 vals,似乎这两个对象共享相同的表。

BaseClass = {}

function BaseClass:new()
    o = {}
    setmetatable(o, self)
    self.__index = self
    o.val = 0
    o.vals = {}
    return o
end

SubClass = BaseClass:new()

function SubClass:new()
    o = {}
    setmetatable(o, self)
    self.__index = self
    return o
end

foo = SubClass:new()
bar = SubClass:new()
foo.val = 1
bar.val = 2
foo.vals[#foo.vals + 1] = 1
bar.vals[#bar.vals + 1] = 2
print(foo.val, bar.val)
print(#foo.vals, #bar.vals)

代码打印出

1 2
2 2

如何解决此问题?如何为 foobar 创建两个不同的表?

点赞
用户3574628
用户3574628

你的 new 方法没有区分子类和实例。(我不知道为什么《Lua 编程》这样做。)解决这个问题的方法之一是使用一个单独的方法来创建子类:

BaseClass = {}
BaseClass.__index = BaseClass

function BaseClass:new()
    o = {}
    setmetatable(o, self)
    o.val = 0
    o.vals = {}
    return o
end

function BaseClass:subclass()
  local c = {}
  setmetatable(c, self)
  c.__index = c
  return c
end

SubClass = BaseClass:subclass()
2019-04-21 16:27:58