これらは 3 つのインターフェースですIServer, IComponent, IClient.
。それらの間の接続は、イベントを通じて行われます。Server, Component, Client
それらをそれぞれ実装するクラスを書きます。
コンポーネント間に依存関係がある場合があります。つまり、コンポーネント y が x に依存している場合、x.Start()
呼び出されると、すべての子孫Start()
が呼び出されます。依存関係は、 にAddDependency()
あるメソッドによって作成されIComponent
ます。(以下のソース コードのリンクを参照してください)。
クライアントはコンポーネントを直接見ることはできず、イベントを使用してサーバーを介してコンポーネントとやり取りします。これは、すべてのコンポーネントとクライアントがサーバーに登録された後にのみ行われます。
問題: メソッドStart()
には 2 つのエントリ ポイントがあります。1:イベント ハンドラStart()
で呼び出されServer
ます (最初のコンポーネント) 2:イベント ハンドラStart()
で呼び出されますComponent
(子孫が開始されます)。
1 の場合: コンポーネントのステータスが既にある場合Running
- スローIllegalOperationException
2 の場合: 子孫がすでにある場合Running
- 何もしません。
1と2の見分け方は?
制限: - インターフェースの変更 - 禁止 - ダウンキャスト - 禁止。
Start()
私が見る1つの解決策は、for 1の最初のコンポーネントが呼び出された直後に落ちる静的フラグを置くことです。ただし、このアプローチはカプセル化を破壊します。これは、「外部」メソッド (サーバーのハンドラーなど) で毎回フラグを再初期化する必要があるため、外部メソッドはインターフェイスで指定されているもの以上のものを認識しなければならないためです。また、これは Start() がサーバーによってのみ呼び出されることを暗黙的に意味しますが、これは問題では保証されていません。
他にアイデアはありますか?
ソース: http://rghost.net/38868270
前もって感謝します。