Здравствуйте, Carc, Вы писали:
C>А если попробовать заюзать какой-нить NVI-паттерн?
C>Т.е. типа сделать в верхнем базовом классе какой-нить ShowButton, который показывает кнопку. Причем сделать его невиртуальным, ибо все равно там простенький функционал в стиле показать\скрыть, и перекрывать его все равно никто не будет, ибо не зачем.
C>А вот это non virtual ShowButton, будет уже вызывать тот самый виртуальный fill, который запросит атрибуты (цвета там или что там было).
А я примерно такую Lazy Initialization и сделал.
По сути чтобы кнопку добавить в DOM-дерево HTML необходимо выполнить
element.appendChild(button.getElement());
Собственно в getElement() я и вызываю fill(), если этого не было еще сделано.
Однако, как всегда и здесь есть нюанс.
Есть методы setEnabled(bool), setTitle(string) и т. д., которые теперь вместо просто модификации элемента, должны ещё проверять, что он вообще был создан, т. е. как минимум:
public setTitle(title: string) {
if (this.el == null)
this.fill();
this.el.textContent = title;
}
и так во всех, обращающихся к элементу методах.
Можно, конечно, заставить все методы обращаться к this.el по методу this.getElement(), кроме this.fill:
public setTitle(title: string) {
this.getElement().textContent = title;
}
Для этого придется сделать this.el приватным и передавать его в fill() как параметр. Плюс надо не забыть потом при дописывании базового класса, что этот el должен быть использован только через getElement(), хотя возможность такая есть. Вариант с удлинением цепочки наследования (Button < ButtonWithPrivateEl) мы не рассматриваем из-за выходящего из-под контроля over-engineering'а.
В общем, всё это делается, да, но не кажется ли, что мы излишне усложнили архитектуру просто из-за надуманного ограничения на задание полей класса до вызова суперконструтора?