2

私はこのコードを持っています:

public interface Position {
  public int getX();
  public int setX(int x);
  public int getY();
  public int setY(int y);
}

public StandardPosition implements Position {
  // STANDARD implementation of Position here
}

public abstract class Mover {
  public abstract Position move ( Position originalPosition ); 
}

「ムーバー」とは、何かを最初の位置から最終的な位置に移動させるものです。

ここが興味深い部分です... 一部のムーバーはより複雑で、もう少し複雑な Position オブジェクトを操作します。

public class ComplicatedPosition extends StandardPosition {
 // ADDS Y DIMENSION
 private int y; 
 public int getY() { return(y); }
 public void setY(int y) { this.y = y ; }
}


public class MoreComplicatedMover extends Mover {

  @Override
  public void Position move(Position initialPosition) {
    ComplicatedPosition q = (ComplicatedPosition) initialPosition; 
    // Do a transformation and 
    // return a new position
    return(q); 
  }

}

ここでの私の質問は ...Position から ComplicatedPosition へのキャストを回避する方法はありますか ...(インターフェイスからクラスにキャストしています..少しぎこちないようです) ...この質問をする別の方法は: ありますか?このコードを設定する他の方法はありますか? 乾杯 !

4

2 に答える 2

0

の APIComplicatedPositionが異なる場合StandardPosition(それが原因だと思います)、Positionインターフェイスを更新し、必要なすべての API をそこに配置します。次に、最初のアプローチは、これらの追加のメソッドを実装しStandardPosition、単純に配置することです

throw new UnsupportedOperationException("");

PositionAdapterより良いアプローチは、アダプターパターンを実装し、これらすべての追加メソッドを実装してスローしてから持つような抽象クラスをUnsupportedOperationException持つことです

public class StandardPosition extends PositionAdapter {
}

StandardPositionこのようにして、あなたや他の実装クラスに不要なメソッドをたくさん実装する必要がなくなります。次に、キャストを取り除き、インターフェイスのすべてのメソッドを呼び出すことができます。お役に立てれば。

于 2013-10-09T02:25:53.690 に答える