Есть базовый класс cObject
от него идут производные классы cCompositeObject cRectangle cProgressBar cLabel cEllipse ............
Реализовано всё это по паттерну Компановщик в cObject есть методы:
virtual void AddPrimitive( cObject* obj ) {}
virtual void Draw(GtkWidget *drawingarea) = 0;
void Draw(GtkWidget *drawingarea);
void AddPrimitive( cObject* obj );
std::list<cObject*> m_elements;
У меня возникает два вопроса: 1) Если у каждого объекта есть свои свойства: например, у cRectangle: BorderColor, ForegroundColor у cLabel: Text, TextColor у cProgressBar: Value и т.д. как оптимальнее всё это организовать? Как сделать удобный доступ к ним? Что посоветуйте?
2) Мне говорили, что необхожимо выделить класс холст, т.к. объект не знает на ЧЁМ он рисует, но тут же паттерн компановщик и идёт грубо говоря рекурсивное рисование:
void cCompositeObject::Draw(GtkWidget *DrawingArea)
{
for(CEitem_type it = begin(); it != end(); ++it)
(*it)->Draw(DrawingArea);
}
как я могут избавить в объектах от прямого задания холста GtkWidget *DrawingArea) ?
Если можно приведите какие-нибудь примеры, будет понятнее, спасибо!