2017-12-09 10 views
1

私は学校用戦艦ゲームの配布版(rmi)を作成しています。ゲームでは、各プレイヤーは艦隊とグリッドを持っているので、私は、このようなリモートオブジェクト実装の非リモートメソッド

class Fleet implements Iterable<Ship> { 

    private List<Ship> fleet; 
    ... 
    @Override 
    public Iterator<Ship> iterator() { return fleet.iterator(); } 
} 

class Player { 

    private Fleet fleet; 
    ... 
    public void placeFleet() { 
     for (Ship s : fleet) { 
      ... 
     } 
    } 
} 

ようなコードを書くためにイテレータを使用できるようにしたかったが、私のクラスFleetは、リモートクラスにする必要があるので、私は何かを持っていますiterator()方法は、リモート・メソッドではありませんので、このよう

interface IFleet extends Remote, Iterable<IShip> {...} 

class Fleet extends UnicastRemoteObject implements IFleet {...} 

はしかし、これはつまり、私はまた

012で試してみた illegal remote method encountered: public abstract java.util.Iterator java.lang.Iterable.iterator()

を取得し、エラーが発生します

interface IFleet extends Remote {...} 

class Fleet extends UnicastRemoteObject implements IFleet, Iterable<IShip> {...} 

だから私は2つの質問がありますのみ

  1. リモートオブジェクトはリモート実装することができ、そのサブインターフェイスを?
  2. rmiクライアントから遠隔オブジェクトのメソッドを何とか隠すことができます(利用できないようにして、にリモートインターフェイスのニーズを尊重することができます)。

ありがとうございました!

Ps:他の方法でクライアントのリストのイテレータを使うことができますが、リモートと一緒に他のインターフェイスを実装できるかどうかは不思議です。

+0

'Iterable 'はインタフェースで、 'extends'ではなく' implements'を意味しましたか? – StaticBeagle

+0

ああ、申し訳ありませんが、私はコードの第2ビットで間違っています –

答えて

1
implements Remote 

これは既に間違っています。 Remoteに拡張され、を実装する独自のリモートインターフェイスを定義する必要があります。私はこれが問題の原因だと思う。クラスには実際のリモートメソッドはまったくありません。そして実際にはUnicastRemoteObjectは既にRemoteを実装しています。

のご質問は以下のとおりです。

  1. リモートオブジェクトがリモートかどうか、それ以外の場合は好きなものは何でもインターフェースを実装することができます。
  2. リモートインターフェイスに表示されていない場合は、既に非表示になっています。

Playerがサーバー側のローカルオブジェクトでない限り、コードは意味をなさないものです。その場合です。

EDITあなたの編集も間違っている:

interface IFleet extends Remote, Iterable<IShip> {...} 

class Fleet extends UnicastRemoteObject implements IFleet {...} 

リモートインタフェースは、リモートのメソッドのみを含めることができ、そして、彼らはRemoteExceptionをスローするように宣言されなければならない、そしてそれはあなたが得たエラーメッセージの理由です。 IterableのメソッドはRemoteExceptionをスローしません。

したがって、リモートインターフェイスはRemoteではなくIterableに拡張する必要があります。あなたがクライアントからそれを隠したいのであれば、それは意味がありません。リモートオブジェクトIterableを実装する必要があります。

私も

interface IFleet extends Remote {...} 

class Fleet extends UnicastRemoteObject implements IFleet, Iterable<IShip> {...} 

で試してみたこれはあなたがしようとしている必要がある唯一のものです。それは働き、あなたの質問を満たします(2)。

+0

いいえ、申し訳ありません、私はそれを単純化するために(私はあなたが理解すると思った、私はそれを変更する)のようにそれを書いた。私は実際にIFleetとIPlayerの両方のインターフェースを持ち、RemoteとIFleetの両方を拡張し、Iterable も拡張しています。それはそれとは関係ありません。リモートインタフェースで宣言されていないメソッドを実装すると、(私が示したような)実行時エラーが発生します。 –

+0

それも間違っています。編集を参照してください。実際のコードを投稿しないと誰も理解できません。 – EJP

関連する問題