0

这是三个接口:IServer, IComponent, IClient.它们之间的连接是通过事件完成的。我编写Server, Component, Client 了分别实现它们的类。

组件之间可能存在依赖关系。也就是说,如果组件 y 依赖于 x 那么在x.Start()调用时 - 调用所有后代Start()。依赖项是由in 中的AddDependency()方法创建的IComponent。(见下面的源代码链接)。

客户端不能直接看到组件并通过服务器使用事件与它们交互。只有在所有组件和客户端都在服务器上注册后,才能完成此操作。

问题:该方法Start()有 2 个入口点:1:在事件处理程序Start()中调用Server(第一个组件) 2:Start()Component事件处理程序中调用(子代已启动)。

对于 1:如果组件的状态已经是Running- throwIllegalOperationException 对于 2:如果后代已经是Running- 什么也不做。

如何区分1和2?

限制: - 修改接口 - 禁止 - 向下转换 - 禁止。

我看到的一个解决方案是放置静态标志,它在第Start()一个组件被调用后立即下降。然而,这种方法破坏了封装,因为每次都应该在某些“外部”方法(例如,在服务器的处理程序中)重新初始化标志,因此外部方法必须看到比接口中指定的更多的东西。这也隐含地暗示 Start() 仅由服务器调用,这在问题中并不能保证。

还有什么想法吗?

来源: http ://rghost.net/38868270

提前致谢。

4

1 回答 1

1

据我所知,您的问题归结为“我有一个只有一个启动方法的界面,我如何判断它是否已经启动而不添加任何其他内容”。

答案让我印象深刻,你不能。你能做的就是IllegalOperationException不管怎么叫都扔。然后在你的组件中你抓住IllegalOperationException并传递(什么都不做)。在您的服务器方法中,您让它冒泡到更相关的位置。

据我所知,这是您给出限制的唯一选择。

注意:我没有查看任何代码,因为我不想从不可靠的来源下载包含 9 个文件的 zip 文件(对您个人没有冒犯)。

于 2012-06-25T17:37:18.017 回答