2

Player から継承する 2 つのクラスがあります。SimplePlayer と InterleavedPlayer です。

クラス B には、setPlayer(SimplePlayer プレーヤー) と setPlayer(InterleavedPlayer プレーヤー) のメソッドがあります。

クラス A には、SimplePlayer または InterleavedPlayer のいずれかになるように設計された Player フィールドがあります。クラス A は、オブジェクトが Player のどのサブクラスであるかに関係なく、これらのプレーヤーで B.setPlayer() を呼び出したいと考えています。

一般化された B.setPlayer(Player player) メソッドで instanceof を使用しないようにするために、サブクラスの B.setPlayer() をオーバーロードしました。

しかし、A が B.setPlayer() を呼び出すと、B.setPlayer(Player) を参照するシンボルが見つからないというエラーが発生します。

問題を解決するには、ここでどの設計アプローチを使用する必要がありますか? (A は実際にプレーヤーを作成するため、理論的には B に渡すものを「知っています」 SimplePlayer と InterleavedPlayer を区別します)。

4

4 に答える 4

1

修正するにはコードを投稿する必要があります... 2 つのオブジェクト間で呼び出しをフリップフロップしているため、メディエーターを使用する必要があります。

Player から継承する 2 つのクラスがあります: SimplePlayer と InterleavedPlayer

わかった

class Player{}
class SimplePlayer extends Player {}
class InterleavedPlayer extends Player{}

クラス A には Player フィールドがあり、SimplePlayer または InterleavedPlayer のいずれかになるように設計されています。クラス A は、オブジェクトが Player のどのサブクラスであるかに関係なく、これらのプレーヤーで B.setPlayer() を呼び出したいと考えています。

わかった

class A { Player field; }

一般化された B.setPlayer(Player player) メソッドで instanceof を使用しないようにするために、サブクラスの B.setPlayer() をオーバーロードしました。

わかった

class B { 
    void setPlayer(InterleavedPlayer player) {  out.println( player );  }  
}

「しかし、A が B.setPlayer() を呼び出すと、B.setPlayer(Player) を参照するシンボルが見つからないというエラーが発生します。」わかった。

Bはインターリーブプレーヤーが必要ですよね?A で B.setPlayer( (InterleavedPlayer) thePlayer ) を呼び出し、Player を Interleaved プレーヤーにキャストすると、さまざまな方法でこれを回避できますが、表示するコードがなければ、多くの言葉になる可能性があります....

特に、必要なコードは Player::setPlayer と Interleaved::setPlayer です。

于 2013-08-16T02:29:57.443 に答える