1

instanceofandメソッドを使用してポリモーフィズムを実装する代わりに、それを読んだことがあります。これgetClassは、より優れたオブジェクト指向の実践であるためです。

私のプログラムが次のように見える場合:

Piece
SlowPiece extends Piece,
FastPiece extends Piece,
SlowFlexible extends SlowPiece,
FastFlexible extends FastPiece

そして、私は次のルールを持っています:SlowPiece's can only move one space, and FastPiece's as many as they'd like.

polymorphismそのようなピースを動かしている場合、複数動かされないようにするにはどうすればよいですかPiece piece1 = new SlowPiece();?

ゲームボード用のクラスがあり、ピースを動かすことができるはずですが、コードスニッフィングなしでSlowPieceを1つ以上動かさないようにする方法がわかりません。

基本的に、ポリモーフィズムが物事をリストアップするのにいかに優れているかは理解できますが、実際にそれらを操作すると、それを適切に使用する方法がわかりません。

4

3 に答える 3

4

抽象Piece化し、抽象メソッドmove()を追加しPieceます (インターフェースを使用することもできます)。別の方法で実装move()します (aSlowPieceは 1 つのスポットのみを移動するなど)。

public abstract class Piece {
    public abstract void move();
}

public class SlowPiece extends Piece {
    public void move() {
        System.out.println("moving a slow piece");
    }
}

public class FastPiece extends Piece {
    public void move() {
        System.out.println("moving a fast piece");
    }
}

Piece f = new FastPiece();
f.move();       

Piece s = new SlowPiece();
s.move();

ここにmove()は、すべての移動ロジックがあります。いくつかのオーバーロードを使用して、さまざまな動きを可能にすることもできます (引数として N/S/W/E を取るなど)。

于 2012-09-30T23:22:50.633 に答える
3

この問題に対するもう 1 つの考慮事項として、基本的な全体的な概念を理解しましょう。

  • Pieceできmove()ます。
  • Piece move()他のものとは異なる方法での特定のタイプ。

インターフェイスとして宣言Pieceし、他のすべてのPieces にこれを実装させることができます。このようにして、 everyに があることを保証し、また、.Piecemove()move()Piece

于 2012-09-30T23:25:23.130 に答える
1

ポリモーフィズム以上に、おそらく責任について考えるべきです。

「ボード」クラスは次のようにする必要があります

piece.move();

ピースは動く方法を知っている必要があります。したがって、サイコロのようなものがある場合は、その番号を move メソッドに渡し、その結果として次のように動作できます。

piece.move(moves);

編集:

ボードは動きを管理する必要があるため、move メソッドがピースによって作成されたステップの int を返すようにします。ムーブメントは、ピース自体からではなく、ボードなどの別のクラスから管理する必要があります。

オブジェクト指向分析に関する非常に興味深い本をお勧めします: Craig Larman による「UML とパターンの適用」。また、モノポリーとしてのボード ゲームの段階的な例も含まれています。

于 2012-09-30T23:19:40.680 に答える