我有一個程序(其中包括)有一個命令行界面,讓用戶輸入字符串,然後將通過網絡發送。問題是我不確定如何將在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