Информация об изменениях

Сообщение Re[4]: Присвоение свойств и вызов виртуального метода из кон от 15.11.2016 9:43

Изменено 15.11.2016 9:44 Carc

Здравствуйте, sharez, Вы писали:


S>Но есть нюанс. Если мы хотим дать программисту (или 3-rd parties) наследоваться от Button, то нам обязательно придется ему вталдычить, чтобы он не забывал вызывать fill() после создания своей кнопки. А это печаль в некотором роде, потому что программистам обязательно захочется отнаследоваться для случая Button < ToolbarButton чтобы банально разом для всех кнопок указать высоту и ширину.


А если попробовать заюзать какой-нить NVI-паттерн?

Т.е. типа сделать в верхнем базовом классе какой-нить ShowButton, который показывает кнопку. Причем сделать его невиртуальным, ибо все равно там простенький функцинал в стиле показать\скрыть, и перекрывать его все равно никто не будет, ибо не зачем.

А вот это non virtual ShowButton, будет уже вызывать тот самый виртуальный fill, который запросит атрибуты (цвета там или что там было).

Т.е. нечто вида
//где-то в CButton есть метод виртуальный
virtual void fill();//или GetColor - чего там было то?

CButton::ShowButton(BOOL bShow)
{
 if (bShow)//если показываем кнопку
    fill();//то вызываем внутри виртуальный метод, который все сначала запросит

CWidget::ShowButton(bShow);//ну а это какая-то простенькая вещь: показать скрыть кнопку
}

Т.е. таким образом мы явно провоцируем последующих кодеров (разработчиков наследников от CButton), вызывать невиртуальный метод показа кнопки. А вот он уже вызывает нужный виртуальный fill, т.к. фактически объект к моменту вызова ShowButton уже полностью создан, отработали все конструкторы всей иерархии.

Костыль конечно, но по крайней мере явный. Без ShowButton ничего нет в UI (не видно), звать обязательно. А вот оно уже всю неочевидную инициализацию завершит.
Re[4]: Присвоение свойств и вызов виртуального метода из кон
Здравствуйте, sharez, Вы писали:


S>Но есть нюанс. Если мы хотим дать программисту (или 3-rd parties) наследоваться от Button, то нам обязательно придется ему вталдычить, чтобы он не забывал вызывать fill() после создания своей кнопки. А это печаль в некотором роде, потому что программистам обязательно захочется отнаследоваться для случая Button < ToolbarButton чтобы банально разом для всех кнопок указать высоту и ширину.


А если попробовать заюзать какой-нить NVI-паттерн?

Т.е. типа сделать в верхнем базовом классе какой-нить ShowButton, который показывает кнопку. Причем сделать его невиртуальным, ибо все равно там простенький функционал в стиле показать\скрыть, и перекрывать его все равно никто не будет, ибо не зачем.

А вот это non virtual ShowButton, будет уже вызывать тот самый виртуальный fill, который запросит атрибуты (цвета там или что там было).

Т.е. нечто вида
//где-то в CButton есть метод виртуальный
virtual void fill();//или GetColor - чего там было то?

CButton::ShowButton(BOOL bShow)
{
 if (bShow)//если показываем кнопку
    fill();//то вызываем внутри виртуальный метод, который все сначала запросит

CWidget::ShowButton(bShow);//ну а это какая-то простенькая вещь: показать скрыть кнопку
}

Т.е. таким образом мы явно провоцируем последующих кодеров (разработчиков наследников от CButton), вызывать невиртуальный метод показа кнопки. А вот он уже вызывает нужный виртуальный fill, т.к. фактически объект к моменту вызова ShowButton уже полностью создан, отработали все конструкторы всей иерархии.

Костыль конечно, но по крайней мере явный. Без ShowButton ничего нет в UI (не видно), звать обязательно. А вот оно уже всю неочевидную инициализацию завершит.