我有一个程序(其中包括)有一个命令行界面,让用户输入字符串,然后将通过网络发送。问题是我不确定如何将在GUI内部深处生成的事件连接到网络接口。假设例如,我的GUI类层次结构是这样的:保持GUI分离
GUI - >主窗口 - > CommandLineInterface - > EntryField
每个GUI对象持有其他一些GUI对象,一切都是私有的。现在,entryField对象会生成一条消息已输入的事件/信号。目前,我传递的信号了类层次结构,因此CLI类将是这个样子:
public:
sig::csignal<void, string> msgEntered;
而在c'tor:
的passUp功能只是发出信号再次所属的类(主窗口)来连接,直到我终于可以做这个主循环:
gui.msgEntered.connect(sigc::mem_fun(networkInterface, &NetworkInterface::sendMSG));
现在,这似乎是一个真正的坏的解决方案。每次我向GUI添加东西时,都必须通过类层次结构进行连接。我确实看到了几种解决方法。我可以让所有对象公开,这将使我只是做这个主循环:
gui.mainWindow.cli.entryField.msgEntered.connect(sigc::mem_fun(networkInterface, &NetworkInterface::sendMSG));
但是,这将违背封装的想法。我也可以在整个GUI上传递一个对网络接口的引用,但我想尽可能保持GUI代码的独立性。
感觉就像我在这里错过了一些重要的东西。有没有一种干净的方式来做到这一点?
注意:我使用的是GTK +/gtkmm/LibSigC++,但我并没有将它标记为这样,因为我已经有了与Qt几乎相同的问题。这确实是一个普遍的问题。
不应该Core实现CoreListener和GUI实现GUIListener? 如果没有,那么我讨厌维护你的代码:P – 2009-02-03 09:37:08
根本不是因为核心需要响应GUI事件,GUI需要响应核心事件。保持这一点非常简单,因为我不必关心核心中的GUI(反之亦然)。 – Bombe 2009-02-03 09:43:25