Проблемы с обработкой связи между классами

#c #class #object #communication

#c #класс #объект #Информационные материалы

Вопрос:

Я работаю над проблемой, когда язык всего приложения должен меняться каждый раз, когда пользователь указывает новый язык на экране. Функция распознавания того, что был выбран новый язык, расположена в одном из классов приложения, Class3. Мне нужен какой-то способ уведомить один из моих объектов о том, что произошло изменение языка. Сложность в том, что этот объект определен в Class1 и инициализирован в другом классе (Class2), и его необходимо обновлять или уведомлять Class3. Вот базовый макет:

ObjectA определен в Class1. ObjectA инициализируется в Class2. К ObjectA необходимо обращаться всякий раз, когда изменяется язык ввода в Class3.

Как мне следует подойти к взаимодействию между всеми этими классами? Я в некотором замешательстве, и любое руководство помогло бы. Извините, если этот пост сбил с толку!!

Комментарии:

1. Посмотрите на шаблон Observer.

2. Помимо шаблонов проектирования и т.д. Что вам нужно, так это Object3 иметь ссылку или указатель на ObjectA . Таким образом, когда изменение языка выполняется в Object3 в одно и то же время ObjectA , оно обновляется с помощью этой ссылки / указателя.

Ответ №1:

Я предполагаю, что в случае языковой зависимости у вас может быть пара объектов, которые необходимо обновить.

Я бы предложил архитектуру, в которой все объекты, зависящие от языка, наследуют некоторый базовый класс (вам решать, достаточно ли простого наследования или потребуется множественное наследование). Тогда виртуальная функция позволяла бы выполнять индивидуальные языковые действия, когда это необходимо.

Базовый класс будет поддерживать список всех созданных и удаленных объектов и предоставлять механизм обновления для смены языка. Что-то вроде:

 class LSensitive {
private: 
    static list<LSensitive*> l;  // all language dependent objects 
protected: 
    virtual void doChangeLanguage(string new_language) = 0;  
                   /* derived class change labels, units, etc... */
public:
    static void changeAll(string new_language) // call this when you want to change !
        { for (auto i = l.begin(); i != l.end(); i  )
                (*i)->doChangeLanguage(new_language); 
        }
    LSensitive()
        { l.push_front(this); }
    virtual ~LSensitive() 
        {   l.remove(this); }
}; 
  

Затем ваш производный класс будет адаптировать код изменения языка, как здесь:

 class Class0 : public LSensitive {
private: 
    static int unique_id;
    int myid; 
public: 
    Class0() : myid(unique_id  ) {};
    ~Class0() {};
    void doChangeLanguage(string new_language)  // implement the class specific change
    { cout << "Object " << myid << ": change language to " << new_language << endl; };
};
  

Когда в class3 или где-либо еще вы заметите, что пришло время сменить язык, тогда просто вызовите:

 LSensitive::changeAll(new_language);
  

Большим преимуществом является то, что где бы вы ни создавали или инициализировали свои объекты, зависящие от языка, этот код найдет их и обновит.