2014-07-03 73 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); 

最大的優點是,無論您創建或初始化語言相關對象,此代碼都會找到並更新它們。