为什么 SuperClass:initialize() 与 lua 中的 SuperClass.initialize(self) 不同?
Why is SuperClass:initialize() different from SuperClass.initialize(self) in lua?
在使用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)
的语法糖,因此应该是相同的。这似乎不是中产阶级的问题,因为我之前使用的另一个 OO 库显示出类似的问题...
我在这里错过了什么?
function Child1:initialize(param)
ParentClass.initialize(self, param)
end
等同于
function Child1:initialize(param)
ParentClass.initialize(Child1, param)
end
所以self
在
function ParentClass:initialize(param)
self.param = param
end
将参考Child1
同时
function Child2:initialize(param)
ParentClass:initialize(param)
end
等同于
function Child2:initialize(param)
ParentClass.initialize(ParentClass, param)
end
所以self
在
function ParentClass:initialize(param)
self.param = param
end
将参考ParentClass
因此代码段 1 将初始化 Child1
,而代码段 2 将初始化基础 class。
在使用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)
的语法糖,因此应该是相同的。这似乎不是中产阶级的问题,因为我之前使用的另一个 OO 库显示出类似的问题...
我在这里错过了什么?
function Child1:initialize(param)
ParentClass.initialize(self, param)
end
等同于
function Child1:initialize(param)
ParentClass.initialize(Child1, param)
end
所以self
在
function ParentClass:initialize(param)
self.param = param
end
将参考Child1
同时
function Child2:initialize(param)
ParentClass:initialize(param)
end
等同于
function Child2:initialize(param)
ParentClass.initialize(ParentClass, param)
end
所以self
在
function ParentClass:initialize(param)
self.param = param
end
将参考ParentClass
因此代码段 1 将初始化 Child1
,而代码段 2 将初始化基础 class。