有三个接口:IServer, IComponent, IClient.
它们之间的连接是通过事件完成的。我写了分别实现它们的Server, Component, Client
类。
组件之间可能存在依赖关系。也就是说,如果组件y依赖于x,则在调用x.Start()
时 - 调用所有后代Start()
。依赖项由AddDependency()
中的IComponent
方法创建。 (参见下面的源代码链接)。
客户端无法直接查看组件并使用事件通过服务器与它们进行交互。只有在服务器上注册了所有组件和客户端后,才能完成此操作。
问题:
方法Start()
有2个入口点:
1:在Start()
事件处理程序(第1个组件)中调用Server
2:Start()
在Component
事件处理程序中调用(后代已启动)。
For 1:如果组件的状态已经Running
- 抛出IllegalOperationException
对于2:如果后代已经Running
- 什么都不做。
如何区分1和2?
限制: - 修改接口 - 禁止 - 向下倾斜 - 禁止。
我看到的一个解决方案 - 是静态标志,它在调用第1个组件的Start()
后立即失效。然而,这种方法破坏了封装,因为每次在一些“外部”方法中(例如在服务器的处理程序中)应该重新初始化该标志,因此外部方法必须看到比接口中指定的更多的东西。此外,这隐含意味着Start()仅由Server调用,但在问题中无法保证。
还有什么想法?
来源: http://rghost.net/38868270
提前致谢。
答案 0 :(得分:1)
据我所知,你的问题归结为“我有一个只有一个启动方法的界面,如何在没有添加任何其他内容的情况下判断它是否已经启动”。
答案让我觉得你做不到。无论如何调用,你所能做的就是抛出IllegalOperationException
。然后在您的组件中捕获IllegalOperationException
并传递(不执行任何操作)。在您的服务器方法中,您可以将其冒泡到更相关的位置。
据我所知,这是你给出限制的唯一选择。
注意:我没有查看任何代码,因为我不想从不值得信任的来源下载包含9个文件的zip文件(对你个人没有冒犯)。