#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. Ты попал в самую точку. Очевидно, но я скучал по этому столько дней. Большое вам спасибо!