2

オブジェクトが渡されるメソッドを作成し、そのメソッドが渡されたオブジェクトに応じてアクションを実行するとします。オブジェクトをどのように識別すればよいですか?

クラス名を使ってオブジェクトを識別することを考えましたが、オブジェクトのクラス名を簡単に変更でき、将来の開発時に頭痛の種になる可能性があるため、実用的ではない可能性があります。私は正しいですか?

編集:たとえば、私はオブジェクトのボールと爆弾を持っています。壁と呼ばれる別のオブジェクトがあり、壁に壁との衝突を解決する方法(たとえば、衝突するボールと爆弾の座標)がありますが、衝突するオブジェクト(つまり、ボールと爆弾)に応じてロジックが異なる場合

4

5 に答える 5

7

あなたが求めているのはinstanceofオペレーターです。

if (object instanceof SomeClass) {
  // do something
} else if (object instanceof SomeOtherClass) {
  // do something else
}

ただし、これは良い方法ではありません。代わりに、いわゆる二重発送を使用することができます。渡されたオブジェクトを、他のクラスに関して操作を定義するインターフェースに準拠させます。そう:

public interface ThrowableItem {
   void throwAt(Wall wall);
}

public class Wall {
    void accept(ThrowableItem item) {
        item.throwAt(this);
    }
}

そして、 と の中で適切な実装を提供しますBall(Bombどちらも を実装しますThrowableItem) 。

Visitor パターンを見てみましょうWallVisitor。各オブジェクトの衝突を処理する方法を知っているに操作を移動できます。

于 2010-05-03T14:01:27.590 に答える
0

使用できますinstanceofが、落とし穴に注意してください。以下のサブクラスでは「true」になります。

if (subclass instanceof superclss)  // returns true
于 2010-05-03T14:13:24.213 に答える
0

switchこのコードは、ポリモーフィズムの使用を検討するように導きます。これにより、命名の問題が自動的にキャンセルされます。

于 2010-05-03T14:01:12.770 に答える
0

それはアクションが何であるかに依存します。それらはどのように関連していますか?同じことを行うオブジェクトがいくつかあるが、方法がわずかに異なるということですか? たとえば、ドキュメントを印刷するメソッドがあり、同じメソッドで pdf ファイルと doc ファイルを印刷したいとします。

あなたの状況がそれに似ている場合は、次のように継承の使用を検討することをお勧めします: スーパークラスを作成します。私の例では、それを print() メソッドで Document と呼びます。print メソッドは何もする必要はありません。次に、ドキュメントの種類ごとにサブクラスを作成します。これにより、最終的に PdfDocument と DocDocument のサブクラスが作成されます。これらはそれぞれ、関連するドキュメントのタイプを印刷できる print() の実装を提供します。

次に、私が書く方法は次のようになります。

  public void printDocument(Document d){
        d.print();
  }

つまり、スーパー クラス タイプをターゲットにすることで、ドキュメントの各タイプが実行する特定のアクションについて心配する必要がなくなります。そうすれば、メソッドに渡されるオブジェクトの型をチェックするコードを回避できます。これにより、将来の拡張のためにコードがより堅牢になります。

于 2010-05-03T14:04:55.190 に答える
0

コンテキストによっては、渡される可能性のあるさまざまな型に対してさまざまなメソッド (オーバーロード) を提供することもできます。

public void doSomething(TypeA object) {
    // TypeA specific stuff
}
public void doSomething(TypeB object) {
    // TypeB specific stuff
}
于 2010-05-03T14:05:56.820 に答える