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

时间:2019-04-20 16:31:38

标签: oop inheritance lua

我想在Lua中建立一个简单的继承层次结构。 &有两个属性,一个值BaseClass和一个表val。如果我创建vals的两个对象foobar并更改这两个属性,则SubClass的更改将按预期工作,但是对于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 foo创建两个不同的表?

1 个答案:

答案 0 :(得分:1)

您的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()