我正在解决每次用户在屏幕上指定新语言时需要更改整个应用程序语言的问题。识别已选择新语言的功能位于应用程序的一个类Class3中。我需要一些方法来通知我的一个对象语言发生了变化。这个对象在Class1中定义,并在不同的类(Class2)中初始化,需要由Class3更新或通知,这很棘手。这是基本布局:
ObjectA在Class1中定义。 ObjectA在Class2中初始化。 只要输入语言在Class3中发生变化,就需要访问ObjectA。
我应该如何处理所有这些类之间的通信?我有点困惑,任何指导都会有所帮助。对不起,如果这篇文章令人困惑!!
答案 0 :(得分: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; };
};
当你在课堂上或其他任何你注意到的时候,是时候改变语言,然后简单地打电话:
LSensitive::changeAll(new_language);
最大的好处是,无论您在何处创建或初始化与语言相关的对象,此代码都会找到并更新它们。