2014-07-03 5 views
0

Je travaille sur un problème où le langage d'une application entière doit changer chaque fois qu'un utilisateur spécifie une nouvelle langue à l'écran. La fonction permettant de reconnaître qu'une nouvelle langue a été sélectionnée se trouve dans l'une des classes de l'application, Class3. J'ai besoin d'un moyen de notifier un de mes objets que le changement de langue a eu lieu. Ce qui est délicat, c'est que cet objet est défini dans Class1 et initialisé dans une classe différente (Class2), et doit être mis à jour ou notifié par Class3. Voici la disposition de base:Problème de gestion de la communication entre les classes

ObjectA est défini dans Class1. ObjectA est initialisé dans Class2. ObjectA doit être accessible chaque fois que la langue d'entrée change dans Class3.

Comment dois-je aborder la communication entre toutes ces classes? Je suis un peu confus et n'importe quelle direction aiderait. Désolé si ce post était confus !!

+3

Regardez dans le modèle Observer. – jready

+1

En plus des modèles de conception etc. Vous avez besoin de 'Object3' pour avoir une référence ou un pointeur sur' ObjectA'. Ainsi, lorsque le changement de langue est fait par 'Object3' en même temps,' ObjectA' est mis à jour via cette référence/pointeur. – 101010

Répondre

0

Je suppose qu'en cas de dépendance de langage, vous pourriez avoir quelques objets à mettre à jour.

Je suggérerais une architecture où tous les objets dépendant de la langue hériteraient de la classe de base (à vous de voir si l'héritage simple est suffisant ou si l'héritage multiple est nécessaire). Une fonction virtuelle permettrait alors des actions linguistiques sur mesure si nécessaire.

La classe de base conserverait une liste de tous les objets créés et supprimés, et fournirait un mécanisme d'actualisation pour changer de langue. Quelque chose comme:

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); } 
}; 

Votre classe dérivée serait alors un code de changement de langue sur mesure comme ici:

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; }; 
}; 

Lorsqu'en class3 ou ailleurs vous remarquez, il est temps de changer la langue, puis appelez simplement:

Le gros avantage, c'est que partout où vous créez ou initialisez vos objets dépendant de la langue, ce code les trouverait et les mettrait à jour.

Questions connexes