Re[5]: Присвоение свойств и вызов виртуального метода из кон
От: sharez  
Дата: 15.11.16 10:32
Оценка:
Здравствуйте, 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'а.

В общем, всё это делается, да, но не кажется ли, что мы излишне усложнили архитектуру просто из-за надуманного ограничения на задание полей класса до вызова суперконструтора?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.