为什么在lua中SuperClass:initialize()和SuperClass.initialize(self)不同?

当使用middleclass时,我遇到了一个奇怪的问题:

ParentClass = class('ParentClass')

function ParentClass:initialize(param)
   self.param = param
end

现在这样可以运行:

Child1 = class('Child1', ParentClass)

function Child1:initialize(param)
  ParentClass.initialize(self, param)
end

但这样不可以运行:

Child2 = class('Child2', ParentClass)

function Child2:initialize(param)
  ParentClass:initialize(param)
end

创建像Child2这样的子节点将导致param的修改不仅仅在单个实例上,而且所有从ParentClass继承的子节点都会改变。

我花了很长时间才找到这个问题,因为我确定Object:function()只是Object.function(Object)的语法糖,因此应该是相同的。这似乎并不是middleclass的问题,因为我之前使用的另一个OO库也有类似的问题...

我错过了什么?

点赞
用户2858170
用户2858170
函数 Child1:initialize(param)
  ParentClass.initialize(self, param)
end

等价于

函数 Child1:initialize(param)
  ParentClass.initialize(Child1, param)
end

因此,在

函数 ParentClass:initialize(param)
   self.param = param
end

中的 self 将指向 Child1

函数 Child2:initialize(param)
  ParentClass:initialize(param)
end

等价于

函数 Child2:initialize(param)
  ParentClass.initialize(ParentClass, param)
end

因此,在

函数 ParentClass:initialize(param)
   self.param = param
end

中的 self 将指向 ParentClass

因此,代码段 1 将初始化 Child1,而代码段 2 将初始化基本类。

2021-05-15 18:03:10