Если есть интерфейс с сигнатурой метода, как показано ниже,
class Interface2
{
public:
virtual ~Interface2() {}
virtual uint getId() = 0;
virtual std::string getName() = 0;
};
class Interface
{
public:
virtual ~Interface(){}
virtual std::list<Interface2*> getData(uint id) = 0;
};
Таким образом, в основном цель getData(uint id)
состоит в том, чтобы открыть внутреннее хранилище Interface2
интерфейсов
Когдареализуя конкретный класс Interface
, он будет хранить хранилище объектов из конкретных классов Interface2
.
Например, следующий способ может быть способом реализации этих интерфейсов
class Interface2Imp : public Interface2
{
public:
uint getId() { return id;}
std::string getName() { return name;}
private:
uint id;
std::string name;
};
class InterfaceImp : public Interface
{
public:
std::list<Interface2*> getData(uint id)
{
std::list<Interface2*> returnList;
std::list<Interface2Imp> & a = storage[id];
for(auto & it : a)
{
returnList.push_back(&it);
}
return returnList;
}
private:
std::map<int, std::list<Interface2Imp> > storage;
}
Но, глядя на то, как реализован getData(uint id)
, мы видим, что он перебирает свое внутреннее хранилище, а затем снова заполняет его списком интерфейсов, который выглядит дорогостоящим (и некрасивым).
Есть лилучший способ выставить внутренние данные интерфейса, которые также могут быть представлены как интерфейсы?