0

これらは 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

前もって感謝します。

4

1 に答える 1

1

私が見ることができる限り、あなたの質問は「開始メソッドだけを持つインターフェースを持っています。他に何も追加せずに、それがすでに開始されているかどうかをどうやって知ることができますか」に要約されます。

答えは、あなたができないということです。あなたができることはIllegalOperationException、それがどのように呼び出されても常に投げることです。次に、コンポーネントで をキャッチしIllegalOperationExceptionて渡します (何もしません)。サーバーメソッドでは、より関連性の高い場所にバブルアップさせます。

私が考える限り、これがあなたが制限を与えた唯一の選択肢です。

注: 信頼できないソースから 9 個のファイルを含む zip ファイルをダウンロードしたくなかったので、コードを確認しませんでした (個人的には不快ではありません)。

于 2012-06-25T17:37:18.017 に答える