背景:我正在开发一个UI Widget工具包以获取经验,我遇到的一个问题是事件的一致性。所有事件都强制执行为常量,因此在小部件之间传播同一事件将保持一致。
这对于鼠标事件和按键事件是可以的;但是,对于绘画事件,我无法保持一致性,因为绘画事件会固有地改变其绘制的任何图形上下文。
在此示例中,我想创建一个可变的图形上下文,以便事件本身保持不变。我意识到了可变的危险,因此,我想听听反对可变的原因以及如果不可接受的替代方法。
为完整起见,这是我的一些代码示例来说明问题:
namespace event {
struct Mouse {
struct Interface {
virtual ~Interface() = 0;
virtual void on_l_press(const Mouse&) {}
virtual void on_l_release(const Mouse&) {}
virtual void on_l_click(const Mouse&) {}
virtual void on_l_drag(const Mouse&) {}
virtual void on_m_press(const Mouse&) {}
virtual void on_m_releas(const Mouse&) {}
virtual void on_m_click(const Mouse&) {}
virtual void on_m_drag(const Mouse&) {}
virtual void on_r_press(const Mouse&) {}
virtual void on_r_release(const Mouse&) {}
virtual void on_r_click(const Mouse&) {}
virtual void on_r_drag(const Mouse&) {}
virtual void on_move(const Mouse&) {}
virtual void on_enter(const Mouse&) {}
virtual void on_exit(const Mouse&) {}
};
gmt::Point<float> point = { -1, -1 };
};
struct Paint {
struct Interface {
virtual ~Interface() = 0;
virtual void on_paint(const Paint&) {}
};
gmt::Rect<float> dirty;
mutable gfx::Context context;
};
}
我听说过Haskell的IO Monads,但不幸的是,我对他们没有太多经验或了解。
还有一个小小的注释,我意识到事件应该是带有getter和setter的类。一旦我有了更好的完成事件的构想,这就是我打算改变的事情。