如何解决特定的循环依赖关系

How to solve a specific circular dependency?

本文关键字:循环 依赖 关系 何解决 解决      更新时间:2023-10-16

所以我的问题不在于代码,而在于实现代码的方法。我正在开发一个GUI,我想让我的按钮知道谁是家长。当然,窗口知道它有哪些按钮。

这创建了一个循环依赖,因为两者都需要能够访问其他方法和属性,至少我更喜欢这样。

我找到了一个有效的解决方案,但我对此不太满意:

我创建了第三个对象,按钮向其写入,它希望窗口执行什么操作。窗口检查第三个目标的命令。

我想问你,如果你知道更好的方法,因为我找不到任何其他方法,这对我有效。

谢谢!

我建议创建一个窗口界面。在按钮的构造函数中提供一个指向窗口接口的返回指针。拥有按钮的窗口取决于按钮,按钮取决于窗口界面。没有循环依赖关系。

struct IWindow {
};
struct Button {
 IWindow* window_;
 Button(IWindow* window) : window_(window){}
};
struct WindowWithButton : IWindow {
  Button button_;
  WindowWithButton() : button_(this) {}
};

然后在IWindow中添加由WindowWithButton实现的虚拟方法,使Button可以从WindowWithButton中获得所需的信息。

这是一种标准模式:

struct Window; // Forward-declare the parent
struct Button {
    void pingParent(); // Only declare members which need
        // more than superficial knowledge of Window
    Window* parent; // Ok, we know there is a Window, somewhere
};
struct Window {
    unique_ptr<Button> child;
    // Other functions using the button
    void pingpong() {child->pingParent();}
    void ping(){}
};
/*optional inline*/ void Button::pingParent() {
    parent->ping();
}