我想在Lua中建立一个简单的继承层次结构。 &
有两个属性,一个值BaseClass
和一个表val
。如果我创建vals
的两个对象foo
和bar
并更改这两个属性,则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
创建两个不同的表?
答案 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()