2011-09-13 8 views
1

で反転したパラメータを持つメソッドを呼び出します。私の質問は、このようなことをどうやって避けるのですか?私は、よりエレガントな方法を考えることはできませんは私がShapeのいくつかのサブクラスを持っているJavaの

public void isIntersecting(Rectangle rectangle) { 
    rectangle.isIntersecting(this); 
} 

+0

メソッド本体が何であるかの良い例を挙げたら、機能をリファクタリングする方法を教えてください。メソッドのシグネチャに関係なく、同じコードですか? –

+0

申し訳ありませんが、私はあなたの質問を理解していません。明らかにcircle.isIntersecting(Triangle tri)はrectangle.isIntersecting(Triangle tri)と同じコードを持つことはありません。それはあなたが意味することですか? – you786

答えて

1

一度(いずれかのクラスでも静的メソッドでも)それらを実装し、すべてのメソッドでその共有コードを呼び出すことができます。

class Rectangle extends Shape{ 
    public boolean isIntersecting(Circle circle){ 
     return Shapes.isIntersecting(this, circle); 
    } 
} 

class Circle extends Shape{ 
    public boolean isIntersecting(Rectangle rectangle){ 
     return Shapes.isIntersecting(rectangle, this); 
    } 
} 

class Shapes{ 
    static boolean isIntersecting(Rectangle rectangle, Circle circle){ 
     // implementation goes here 
    } 
} 
+0

Yuckは2がEnuffだったときに3つの方法を持っています。 –

+0

代わりに実装をRectangle(またはCircle)に配置しています(@ Stephenの答えを参照してください)。しかし、私は個人的にはCircleクラスにRectangleコードを混在させたくありません。 Shapesクラスは公開する必要はありません(ユーザーには見えないようにすることができます)。 – Thilo

+0

これは私がやってしまうかもしれないと思うものですが、私は今受け入れを延期します。 @mP私はThiloに同意します。私はむしろこれを行い、コードを混ぜます。 – you786

2

単純な答えは、と(例えば)サークルの交差点メソッドを実装することです。


このようにAPIメソッドを定義すると問題:

public void isIntersecting(Shape) { ... } 

を使用すると、異なる形状のそれぞれに対する場合と「instanceofの」スイッチをコーディングする必要が終わるということです。繰り返しのコードはまだありますが、静的な型付けを潜在的により壊れやすいものに置き換えました...

(AFAIK、任意の2つの図形が交差するかどうかをテストするための一般的な/効率的なアルゴリズムはありません。シェイプには曲線が含まれます)。

+0

+1。 CircleコードをRectangleに入れたくない場合は、すべてのShapeの交差計算を行う静的メソッドを持つヘルパークラスを用意してください。 – Thilo

+0

私はrectangle.isIntersecting(this)を考えましたが、すぐにコードを置くための本当に「正しい」場所がないことを認識しました。 RectangleクラスまたはCircleクラスにする必要がありますか?また、私はAPIメソッドをどのように定義することを提案しますか?あなたは正しいです、今の私はinstanceofスイッチを持っていますが、私はそれがまったく好きではありません。 – you786

関連する問題