私は大学のプロジェクトのコードを書いています。我々は、遠隔地やマルチプレイヤーでプレーするボードゲームを実装しなければならない。Javaのストリームを介したオブジェクトの多型?
現在、要求応答パターンを使用しています。クライアントはIOストリームを通じて要求をサーバーに送信し、サーバーはそれらを分析して正しい応答を返します。
問題は、我々は要求の多くの種類があり、我々は1が受信された要求を理解するために多型を使用していることである。
/**
* This method is only functional to polymorphism: it should never be invoked.
* @param request
* @return only an assertion error
*/
public ResponseMsg handleRequest(RequestMsg request) {
throw new AssertionError("It was created a RequestMsg. This should never happen.\n"
}
/**
* The request is to change the map.
* If the game is not started and the player is the first, the map will be changed and
* a broadcast with the new map will be sent to all the players.
* @param request: the request containing the name of the map chosen
* @return An ack response message
*/
public ResponseMsg handleRequest(ChangeMapRequestMsg request) {
if (game != null)
return new InvalidRequestMsg("You can't change the map when the game is already started");
else if (request.getToken().getPlayerNumber() != 0)
return new InvalidRequestMsg("Only the first player can change the map");
else {
this.map = request.getMap();
BroadcastMsg broadcast = new ChangedMapBroadcastMsg(request.getMap());
publisherInterface.publish(broadcast, getLobby());
return new AckResponseMsg("Map changed successfully");
}
}
/**
* Handles a chat message
* it sends a broadcast containing the message to all the players and an
* acknowledgement to the player who sent it
*
* @param the chat request from the player
* @return the acknowledgement
*/
public ResponseMsg handleRequest(SendChatRequestMsg request) {
ChatBroadcastMsg chatBroadcast = new ChatBroadcastMsg(players.indexOf(request.getToken()), request.getMessage());
publisherInterface.publish(chatBroadcast, getLobby());
return new AckResponseMsg("Chat message sent.");
}
問題は、我々はサーバーにリクエストを送信するとき、私たちに必要なことですそれらを出力ストリームに渡し、入力ストリームを通じてそれらを読み込みます。私たちはそれらをObject
とする必要があり、多型を利用する可能性は失っています。
多形性を利用する方法をどのように維持できますか?私たちの教授が決してそれをすることはないと私たちが言ったように、instanceof
を要求の動的なタイプを得るために使用しないことを望みます。
オブジェクトを基本リクエストクラス(RequestMsg)にキャストできませんか?特定の要求タイプを知る必要はありません。 – Eran
私たちはそれを行いました。呼び出されたメソッドは、一般的なものでしたが、特定のものが必要でした。 – Luvi
これらのメソッドはすべて同じクラスに定義されていますか?それはどのクラスですか? – Eran