Почему СуперКласс:инициализировать() отличается от суперкласса.инициализировать(самостоятельно) в lua?

#oop #lua

Вопрос:

При использовании среднего класса я столкнулся со странной проблемой:

 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 не для одного экземпляра, а для всех дочерних элементов, которые наследуются от родительского класса.

Мне потребовалось довольно много времени, чтобы определить эту проблему, так как я был уверен, что Object:function() это просто синтаксический сахар Object.function(Object) и, следовательно, должен быть таким же. Похоже, что это как-то не проблема среднего класса, потому что другая библиотека OO, которую я использовал раньше, показывала аналогичные проблемы…

Что я здесь упускаю?

Ответ №1:

 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 инициализирует базовый класс.

Комментарии:

1. Ты попал в самую точку. Очевидно, но я скучал по этому столько дней. Большое вам спасибо!