привет.
есть некий интерфейс IElement. В иерархии есть класс IGroup, который имеет все свойства интерфейса IElement, но отличается лишь тем, что может внутри хранить другие элементы и группы (некое дерево).
вопрос в том, какой паттерн используется для работы с такой иерархией?
class IElement
{
public:
virtual std::string GetName() = 0;
virtual void Export() = 0;
};
class IGroup: public IElement
{
public:
virtual std::string GetName() = 0;
virtual void Export() = 0;
};
class Group: IGroup
{
public:
virtual std::string GetName(){ return ""; }
virtual void Export(){}
private:
std::vector< IElement > m_children;
};
Как это описать так, чтобы с одной стороны я всегда знал, какой тип у m_children[i], и с другой стороны мог работать с группой, как с элементом?
Пока в голову пришел только Посетитель (GoF): создать итератор на основе посетителя всей иерархии.
есть какие-то стандартные приемы, примеры?