【发布时间】:2009-12-18 22:13:18
【问题描述】:
我在设计问题上有点挣扎。我在 C# 中制作了一个非常简单的 gui 系统。该代码旨在可重用,因此我在这里寻找最灵活的解决方案。我提出的解决方案似乎都有其缺点。
为简单起见,我们假设存在三个类:控制器、按钮和客户端代码。客户端代码是使用 gui 系统的代码。它创建控制器并在其上调用 Update()。控制器创建一堆按钮实例并在它们上调用 Update()。按钮会自行绘制并检查鼠标点击。
现在的问题是我如何才能知道按钮被点击到客户端代码的事实?
选项 1:将 GetButton(string name) 添加到控制器类。然后客户端代码可以订阅按钮 class=> GetButton("but").MouseUpEvent += MouseUpHandler; 中定义的事件。这样做的缺点是,这会暴露 Button.Update(),并且只能由控制器使用。
选项 2:让控制器订阅所有按钮,客户端代码订阅控制器。这里的缺点是在客户端代码中解析代码更多,因为现在所有事件都通过控制器汇集,因此客户端必须检查哪个按钮发送了每个事件。我更喜欢像选项 1 那样在初始化阶段设置事件流。
选项 3:为每个事件向控制器添加订阅/取消订阅方法(SubscribeMouseUp(string buttonName, GUIDelegate del) 等)缺点是控制器 api 增长很快。
所以现在我倾向于选项 1,但 GetButton 返回一个仅声明事件的接口(可能是 IClientButton),从而对客户端隐藏了 Update(),但我不确定这是否是应该使用接口的方式.
感谢任何见解。 巴斯
【问题讨论】:
标签: c# events event-handling