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

Сообщение Как работать с производным интерфейсом? от 27.05.2018 11:09

Изменено 27.05.2018 11:15 Максим Рогожин

Как работать с производным интерфейсом?
Привет!

Хочу написать приложение, в котором все основные сущности будут представлены своими интерфейсами. Конкретные реализации будут создаваться в фабриках.

Например, имеется иерархия интерфейсов:
class IElement {
public:
   int getId() const =0; // общий метод
   virtual ~IElement() {};
};

class IFoo : public IElement {
public:
   int getSize() const =0; // специфический для IFoo метод
   virtual ~IFoo() {};
};

class IBar : public IElement {
public:
   bool isValid() const =0;  // специфический для IBar метод
   virtual ~IBar() {};
};


Допустим есть коллекция:
std::vector<IElement> coll;


и надо обработать каждый элемент. Как это сделать? С помощью паттерна Визитор?
class ConcreteFoo : public IFoo {
public:
  void accept(Visitor &v) override {
    v.visit(*this);
  }
};

Но тип *this будет ConcreteFoo, а надо IFoo... вроде как... Подскажите, пожалуйста.
Как работать с производным интерфейсом?
Привет!

Хочу написать приложение, в котором все основные сущности будут представлены своими интерфейсами. Конкретные реализации будут создаваться в фабриках.

Например, имеется иерархия интерфейсов:
class IElement {
public:
   int getId() const =0; // общий метод
   virtual ~IElement() {};
};

class IFoo : public IElement {
public:
   int getSize() const =0; // специфический для IFoo метод
   virtual ~IFoo() {};
};

class IBar : public IElement {
public:
   bool isValid() const =0;  // специфический для IBar метод
   virtual ~IBar() {};
};


Допустим есть коллекция:
std::vector<IElement> coll;


и надо обработать каждый элемент. Как это сделать? С помощью паттерна Визитор?
class ConcreteFoo : public IFoo {
public:
  void accept(Visitor &v) override {
    v.visit(*this);
  }
};

Но тип *this будет ConcreteFoo, а надо IFoo, так как все должно работать через интерфейсы, а не через конкретные типы. Подскажите, пожалуйста.