Построение системы графического интерфейса, и у меня есть несколько классов для различных компонентов графического интерфейса, которые являются производными от базового класса "GUIcontrol".Я хочу иметь только одну функцию для возврата любого типа компонента, но иметь возможность работать с функциями, специфичными для этого типа компонента (функции производного класса).Я заметил, что подход к полиморфизму станет проблемой, и я должен объявить все производные функции в базе, которые для этого не нужны, поскольку я никогда не буду создавать объект только из базового класса.
class GUIcontrol {
protected:
std::string _name;
// these two methods (along with name()) will be used by all types
virtual void position(/*parameters*/)
virtual void useImage(/*parameters*/)
// these should be only in derived types
virtual void setHotSpot(/*parameters*/);
virtual void setScrollButtons(/*parameters*/);
public:
std::string name();
/*etc*/
}
class GUIbutton : public GUIcontrol {
public:
void setHotSpot(/*parameters*/);
}
class GUIscrollBar : public GUIcontrol {
public:
void setScrollButtons(/*parameters*/);
}
GUIcontrol* GUIsystem::getControl(std::string name);
Проблема в том, что если я хочу добавить больше функций, уникальных для GUIbutton или GUIscrollBar, или любых функций для других производных классов GUI, я также должен объявить их виртуальными в базовом классе, чтобы компилятор не жаловался на что-то вроде«setHotSpot» не является членом базового класса, который он возвращает.
Базовый класс имеет функции-члены, которые будут применяться ко всем производным классам, таким как указание объекту, где он должен быть расположен, какое изображение ему нужно использовать, как он должен называться и т. Д. Но яя не хочу наполнять базовый класс другими функциями, которые должны оставаться исключительными для определенных производных классов.
Поскольку я продолжаю добавлять больше виртуальных функций, я получу огромный объект BLOB-объектов для базового класса.Могу ли я разработать это более чистым способом?Обратите внимание, что я все еще не уверен, хочу ли я использовать static_cast / dynamic_cast для getControl (), чтобы решить эту проблему, но просто хочу знать, есть ли другие способы обойти это, чтобы очистить его.