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