@yarushin_a

Как реализовать общение объектов данными заранее неизвестного типа через интерфейс?

Есть 2 объекта - A и B, наслдеованные от одного интерфейса. Объект A хранит некоторые данные которые запрашивает B. То, чего удалось достичь - B запрашивает данные и получает их, вот только как видно по коду это обмен строками, необходимо чтоб тип данных заранее был неизвестен. Понимаю что для этого методы интерфейса GetMessage и SendMessage должны быть шаблонными, но одновременно шаблонными и виртуальными они быть не могут.

#include <iostream>
#include <vector>

using namespace std;


class BaseClass;

//=========================================

class Mediator{

public:
    void addObj(BaseClass *obj){
        this->objList.push_back(obj);
    }

    BaseClass* getObj(int index){
        return objList[index];
    }

    template<typename T>
    void Redirect(T message, BaseClass *sender){
        sender->GetMessage(message);
    }

private:
     vector<BaseClass*> objList;
};


//=========================================

class BaseClass {
public:
    Mediator *mediator;
    virtual void SendMessage(string action) = 0;
    virtual void GetMessage(string action) = 0;
};


//=========================================

class B : public BaseClass{
public:
    B(Mediator *mediator){

        this->mediator = mediator;
        this->mediator->addObj(this);
    }

    void SendMessage(string action) override{
        this->mediator->Redirect(action,this->mediator->getObj(0));
    }
    void GetMessage(string action) override{
        cout << "I'm B - " << action << endl;
    }
};

//=========================================

class A : public BaseClass{
public:
    string getX(){return this->x;}
    A(){

       this->mediator = new Mediator();
        this->mediator->addObj(this);

    }

    void SendMessage(string action) override{
        this->mediator->Redirect(action,this->mediator->getObj(1));
    }

    void GetMessage(string action) override{
        if(action == "getX"){
            this->SendMessage(getX());
        }
    }
private:
    string x = "5";
};



int main()
{

    A *a = new A();
    B *b = new B(a->mediator);
    b->SendMessage("getX");
    return 0;
}
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы