2014-07-03 65 views
0

我正在处理一个问题,即每次用户在屏幕上指定一种新语言时需要更改整个应用程序的语言。识别已选择新语言的功能位于应用程序类之一Class3中。我需要通过某种方式通知我的一个对象语言发生了变化。棘手的是,这个对象是在Class1中定义的,并且在不同的类(Class2)中初始化,并且需要被Class3更新或通知。以下是基本布局:问题处理类之间的通信

ObjectA在Class1中定义。 ObjectA在Class2中初始化。 只要输入语言在Class3中更改,就需要访问ObjectA。

我应该如何处理所有这些类之间的通信?我有点困惑,任何指导都会有所帮助。对不起,如果这篇文章令人困惑!

+3

观察Observer模式。 – jready

+1

除了设计模式等你需要的是'Object3'有一个引用或指针'ObjectA'。因此,当通过'Object3'完成语言改变时'ObjectA'通过这个参考/指针被更新。 – 101010

回答

0

我想在语言依赖的情况下,你可能会有一些对象被更新。

我会建议一个架构,其中所有语言依赖对象继承一些基类(由您来看简单继承是足够的还是多个继承是必要的)。然后,虚拟功能将允许在必要时进行量身定制的语言操作。

基类将维护创建和删除的所有对象的列表,并提供更新语言的刷新机制。喜欢的东西:

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

最大的优点是,无论您创建或初始化语言相关对象,此代码都会找到并更新它们。